Her giver jeg et eksempel på PL/SQL lagret funktion til at validere kreditkortnummeret og identificere dets type, uanset om det er et Visa, MasterCard eller American Express kreditkort. Jeg tjekker kreditkortnummeret ved hjælp af LUHN-algoritmen, som bruges til at validere en række identifikationsnumre. Hvis kreditkortnummeret er gyldigt, kontrollerer funktionen for sin type.
PL/SQL-funktionseksempel til validering af kreditkortnummer og dets type i Oracle
Den følgende funktion tager et argument som kreditkortnummer og validerer derefter nummeret ved hjælp af Luhn-algoritmen og returnerer dets type. I øjeblikket understøtter denne PL/SQL-funktion tre slags kreditkort, som er Visa, MasterCard og American Express. Du kan ændre for at tilføje flere kreditkorttyper. Funktion CHECK_LUHN_ALGO for at kontrollere tallet ved hjælp af Luhn-algoritmen er skrevet inde i funktionen VALIDATE_CC, så hvis du vil tilføje flere korttyper, er det ikke nødvendigt at ændre CHECK_LUHN_ALGO-funktionen, skift kun hoveddelen af funktionen 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
Skift 4047xxxxxxxxxxxx-strengen nedenfor med dit Visa-, MasterCard- eller Amex-kreditkortnummer for at teste.
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; /
Output
A Valid Visa Credit Card Number. PL/SQL procedure successfully completed.
Bemærk: Test grundigt før implementering i din applikation.
Se også:
- Valider e-mailadresse ved hjælp af PL/SQL i Oracle