読者です 読者をやめる 読者になる 読者になる

小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


PL/SQLでモジュラス11ウェイト2~7(M11W2~7)を実装してみた。

はじめに

OracleのPL/SQLでモジュラス11ウェイト2~7(M11W2~7)方式でチェックディジットを計算する関数を実装してみました。

独習Oracle PL/SQL
独習Oracle PL/SQL
posted with amazlet at 14.10.09
林 優子
翔泳社
売り上げランキング: 200,248

モジュラス11ウェイト2~7(M11W2~7)実装してみる - よねのはてなモジュラス11ウェイト2~7(M11W2~7)実装してみる - よねのはてな

サンプルプログラム
CREATE OR REPLACE FUNCTION MOD11WEIGHT27(P_CODE IN VARCHAR2)
RETURN NUMBER
IS
  vWeight PLS_INTEGER;
  vSum    PLS_INTEGER;
  
BEGIN
  vWeight := 2;
  vSum := 0;
 
  FOR i IN REVERSE 1..LENGTH(P_CODE)
  LOOP
    vSum := vSum + vWeight * CAST(SUBSTR(P_CODE, i, 1) AS PLS_INTEGER);
    vWeight := vWeight + 1;
    -- ウエイトが7を超えたら元に戻す
    IF (vWeight = 8) THEN
      vWeight := 2;
    END IF;
  END LOOP;
  -- あまりがゼロなら0
  IF (vSum MOD 11 = 0) THEN
    RETURN 0;
  END IF;
  -- あまりが1なら0
  IF (vSum MOD 11 = 1) THEN
    RETURN 0;
  END IF;
  -- 11 から 総和÷11のあまりを引く
  RETURN 11 - (vSum MOD 11);
END;
/
実行結果
BEGIN
  DBMS_OUTPUT.PUT_LINE('check digit::' || MOD11WEIGHT27(123456789));
END;
/
>2
関連記事