Tutaj podaję przykład funkcji przechowywanej w PL/SQL do sprawdzania numeru karty kredytowej i identyfikowania jej typu, niezależnie od tego, czy jest to karta kredytowa Visa, MasterCard czy American Express. Sprawdzam numer karty kredytowej za pomocą algorytmu LUHN, który służy do weryfikacji różnych numerów identyfikacyjnych. Jeśli numer karty kredytowej jest prawidłowy, funkcja sprawdza jej typ.
Przykład funkcji PL/SQL do sprawdzania numeru karty kredytowej i jej typu w Oracle
Poniższa funkcja przyjmuje argument jako numer karty kredytowej, a następnie sprawdza numer za pomocą algorytmu Luhna i zwraca jego typ. Obecnie ta funkcja PL/SQL obsługuje trzy rodzaje kart kredytowych, którymi są Visa, MasterCard i American Express. Możesz zmodyfikować, aby dodać więcej typów kart kredytowych. Funkcja CHECK_LUHN_ALGO do sprawdzania liczby za pomocą algorytmu Luhna jest zapisana wewnątrz funkcji VALIDATE_CC, więc jeśli chcesz dodać obsługę większej liczby typów kart, nie musisz zmieniać funkcji CHECK_LUHN_ALGO, zmień tylko główną część funkcji 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;
Test
Zmień poniższy ciąg 4047xxxxxxxxxxxx na numer karty Visa, MasterCard lub Amex Credit Card w celu przetestowania.
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; /
Wyjście
A Valid Visa Credit Card Number. PL/SQL procedure successfully completed.
Uwaga: Przetestuj dokładnie przed wdrożeniem w swojej aplikacji.
Zobacz też:
- Zweryfikuj adres e-mail za pomocą PL/SQL w Oracle