バーコードなどで使用されている JAN コードのチェックデジットを計算する。(モジュラス 10/ウェイト3)
それぞれのコード長は色々と種類があるようで最大長もわからないので個別にインプリメントしてください。 PLS_INTEGER で計算できる範囲内であるとは思います。
JAN のチェックデジットの計算方法は、一般財団法人 流通システム開発センター で解説されています。
(ちなみ、流通システム開発センターは日本のバーコードの一元管理などを行っているところです。)
書籍 JAN、雑誌 etc コードなどもモジュラス 10/ウェイト 3 のようです。(数点ですが手持ちのもので動作確認してみました。)
CREATE OR REPLACE FUNCTION RIVUS.CD_MOD10_WEIGHT3(P_CODE IN VARCHAR2)
RETURN NUMBER
IS
vWeight PLS_INTEGER;
vSum PLS_INTEGER;
BEGIN
vWeight := 3;
vSum := 0;
FOR i IN REVERSE 1..LENGTH(P_CODE)
LOOP
vSum := vSum + vWeight * CAST(SUBSTR(P_CODE, i, 1) AS PLS_INTEGER);
vWeight := 4 - vWeight; -- 1 と 3 のフリップフロップ
END LOOP;
RETURN (10000 - vSum) MOD 10;
END;
/