首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 銀行卡號 Luhn 演算法驗證函數(PL/SQL 純代碼實現)

     編輯:Oracle 教學

Oracle 銀行卡號 Luhn 演算法驗證函數(PL/SQL 純代碼實現)

銀行卡號最後一位為檢查碼,依 Luhn 演算法(Mod 10) 計算。本函數輸入卡號字串,回傳 'ok' 表示校驗通過,否則回傳正確的檢查碼字元,便於前端提示或自動修正。純 PL/SQL 實現,無外部相依,可直接部署於資料庫層。

函數完整代碼

CREATE OR REPLACE FUNCTION checkBankCard(p_bankcard IN VARCHAR2) RETURN VARCHAR2
-- 正確時返回 'ok',否則返回正確的校驗碼字元
IS
  curval   NUMBER := 0;
  total    NUMBER := 0;
  everyother NUMBER := 1;
  v_end    NUMBER;
BEGIN
  IF p_bankcard IS NULL THEN RETURN 'null'; END IF;

  -- 從倒數第二位開始向左處理(跳過最後一位檢查碼)
  FOR i IN REVERSE 1 .. (LENGTH(p_bankcard) - 1) LOOP
    curval := TO_NUMBER(SUBSTR(p_bankcard, i, 1));

    IF everyother = 1 THEN
      everyother := 0;
      curval := curval * 2;
      IF curval > 9 THEN curval := curval - 9; END IF; -- 兩位數相加等同減 9
    ELSE
      everyother := 1;
    END IF;

    total := total + curval;
  END LOOP;

  -- 計算應有的檢查碼
  IF MOD(total, 10) = 0 THEN v_end := 0;
  ELSE v_end := 10 - MOD(total, 10);
  END IF;

  -- 比對最後一位
  IF TO_CHAR(v_end) = SUBSTR(p_bankcard, LENGTHB(p_bankcard), 1) THEN
    RETURN 'ok';
  ELSE
    RETURN TO_CHAR(v_end);
  END IF;
END;

演算法邏輯解析

  1. 從右往左(不含檢查碼),隔一位乘 2(即偶數位置)
  2. 乘 2 後若 ≥10,則減 9(等同兩位數字相加:12→1+2=3,12-9=3)
  3. 所有處理後數字求和
  4. 總和模 10 為 0 → 檢查碼 0;否則檢查碼 = 10 - (總和模 10)
  5. 比對卡號最後一位,相符返回 'ok',不符返回正確檢查碼

測試範例

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved