Qui sto fornendo un esempio di funzione memorizzata PL/SQL per convalidare il numero di carta di credito e identificarne il tipo, sia che si tratti di una carta di credito Visa, MasterCard o American Express. Sto controllando il numero della carta di credito utilizzando l'algoritmo LUHN che viene utilizzato per convalidare una serie di numeri di identificazione. Se il numero di carta di credito è valido, la funzione ne verifica il tipo.
Esempio di funzione PL/SQL per convalidare il numero di carta di credito e il relativo tipo in Oracle
La funzione seguente accetta un argomento come numero di carta di credito, quindi convalida il numero utilizzando l'algoritmo Luhn e ne restituisce il tipo. Attualmente, questa funzione PL/SQL supporta tre tipi di carte di credito che sono Visa, MasterCard e American Express. È possibile modificare per aggiungere più tipi di carta di credito. La funzione CHECK_LUHN_ALGO per controllare il numero usando l'algoritmo Luhn è scritta all'interno della funzione VALIDATE_CC, quindi se vuoi aggiungere più tipi di carta supportati non c'è bisogno di cambiare la funzione CHECK_LUHN_ALGO, cambia solo la parte principale della funzione 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
Modifica la stringa 4047xxxxxxxxxxxx di seguito con il numero della tua carta di credito Visa, MasterCard o Amex per eseguire il test.
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; /
Uscita
A Valid Visa Credit Card Number. PL/SQL procedure successfully completed.
Nota: Testare accuratamente prima dell'implementazione nella tua applicazione.
Vedi anche:
- Convalida indirizzo email utilizzando PL/SQL in Oracle