sql >> データベース >  >> RDS >> Oracle

PL / SQLを使用してクレジットカード番号を検証し、そのタイプを識別する方法は?

    ここでは、クレジットカード番号を検証し、そのタイプ(Visa、MasterCard、American Expressクレジットカード)を識別するためのPL/SQLストアド関数の例を示します。さまざまな識別番号の検証に使用されるLUHNアルゴリズムを使用して、クレジットカード番号を確認しています。クレジットカード番号が有効な場合、関数はそのタイプをチェックします。

    Oracleでクレジットカード番号とそのタイプを検証するためのPL/SQL関数の例

    次の関数は、クレジットカード番号として引数を取り、Luhnアルゴリズムを使用して番号を検証し、そのタイプを返します。現在、このPL / SQL関数は、Visa、MasterCard、AmericanExpressの3種類のクレジットカードをサポートしています。クレジットカードの種類をさらに追加するように変更できます。 Luhnアルゴリズムを使用して番号をチェックする関数CHECK_LUHN_ALGOは、関数VALIDATE_CC内に記述されているため、カードタイプのサポートをさらに追加する場合は、CHECK_LUHN_ALGO関数を変更する必要はなく、VALIDATE_CC関数の主要部分のみを変更します。

    CREATE OR REPLACE FUNCTION validate_CC (cc_number IN VARCHAR2)
       RETURN VARCHAR2
    IS
       v_ret_string   VARCHAR2 (100);
    
       FUNCTION check_luhn_algo (p_ccnumber VARCHAR2)
          RETURN NUMBER
       IS
          i          NUMBER;
          n_ntoi     SMALLINT;
          n_retval   SMALLINT;
          n_calc     NUMBER := 0;
          n_ntoc     NUMBER;
       BEGIN
          n_ntoc := LENGTH (p_ccnumber);
    
          FOR i IN 1 .. n_ntoc
          LOOP
             n_ntoi := TO_NUMBER (SUBSTR (p_ccnumber, n_ntoc + 1 - i, 1));
    
             n_calc :=
                  n_calc
                + MOD (i, 2) * n_ntoi
                + MOD (i + 1, 2) * SIGN (-SIGN (n_ntoi - 4) + 1) * (2 * n_ntoi)
                +   MOD (i + 1, 2)
                  * SIGN (SIGN (n_ntoi - 5) + 1)
                  * (2 * n_ntoi - 9);
          END LOOP;
    
          n_retval := SIGN (MOD (n_calc, 10));
    
          RETURN n_retval;
       EXCEPTION
          WHEN OTHERS
          THEN
             RETURN 1;
       END check_luhn_algo;
    BEGIN
       /* Credit card number is invalid if below funciton returns non zero value */
       IF check_luhn_algo (cc_number) != 0
       THEN
          v_ret_string := 'Not a valid Credit Card Number.';
          RETURN v_ret_string;
       ELSE
          v_ret_string := 'A Valid ';
       END IF;
    
       /* Credit card number is valid now check for its type */
    
       IF SUBSTR (cc_number, 1, 1) = '4'          /* check if it is a Visa card */
       THEN
          IF LENGTH (cc_number) = 13 OR LENGTH (cc_number) = 16
          THEN
             v_ret_string := v_ret_string || 'Visa Credit Card Number.';
          END IF;
       ELSIF SUBSTR (cc_number, 1, 2) BETWEEN 51 AND 55  /* check if master card*/
       THEN
          IF LENGTH (cc_number) = 16
          THEN
             v_ret_string := v_ret_string || 'MasterCard Credit Card Number.';
          END IF;
       ELSIF SUBSTR (cc_number, 1, 2) = 34 OR SUBSTR (cc_number, 1, 2) = 37 /* check if amex card */
       THEN
          IF LENGTH (cc_number) = 15
          THEN
             v_ret_string :=
                v_ret_string || 'American Express Credit Card Number.';
          END IF;
       ELSE
          v_ret_string := v_ret_string || 'But unable to identify its type.';
       END IF;
    
       RETURN v_ret_string;
    EXCEPTION
       WHEN OTHERS
       THEN
          RETURN 'Error...';
    END validate_CC;

    テスト

    テストするVisa、MasterCard、またはAmexクレジットカード番号を使用して、以下の4047xxxxxxxxxxxx文字列を変更してください。

    SET SERVEROUTPUT ON;
    
    DECLARE
       RetVal      VARCHAR2 (100);
       CC_NUMBER   VARCHAR2 (100);
    BEGIN
       CC_NUMBER := '4047xxxxxxxxxxxx';
    
       RetVal := VALIDATE_CC (CC_NUMBER);
       DBMS_OUTPUT.put_line (retval);
    END;
    /

    出力

    A Valid Visa Credit Card Number.
    PL/SQL procedure successfully completed.

    注: アプリケーションに実装する前に徹底的にテストしてください。

    関連項目:

    • OracleでPL/SQLを使用して電子メールアドレスを検証する
    1. ユーザーアカウント管理、役割、権限、認証PHPおよびMySQL-パート6

    2. 週数を日付に変換する方法は?

    3. 本番環境に対応したデータベース展開に関するDevOpsの考慮事項

    4. postgresqlへのdictオブジェクトの追加