Aquí doy un ejemplo de la función almacenada PL/SQL para validar el número de tarjeta de crédito e identificar su tipo, ya sea una tarjeta de crédito Visa, MasterCard o American Express. Estoy comprobando el número de la tarjeta de crédito mediante el algoritmo LUHN que se utiliza para validar una variedad de números de identificación. Si el número de tarjeta de crédito es válido, la función verifica su tipo.
Ejemplo de función PL/SQL para validar el número de tarjeta de crédito y su tipo en Oracle
La siguiente función toma un argumento como número de tarjeta de crédito y luego valida el número utilizando el algoritmo de Luhn y devuelve su tipo. Actualmente, esta función PL/SQL admite tres tipos de tarjetas de crédito:Visa, MasterCard y American Express. Puede modificar para agregar más tipos de tarjetas de crédito. La función CHECK_LUHN_ALGO para verificar el número usando el algoritmo de Luhn está escrita dentro de la función VALIDATE_CC, por lo que si desea agregar más tipos de tarjetas compatibles, no es necesario cambiar la función CHECK_LUHN_ALGO, cambie solo la parte principal de la función 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;
Prueba
Cambie la cadena 4047xxxxxxxxxxxx a continuación con su número de tarjeta de crédito Visa, MasterCard o Amex para probar.
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; /
Salida
A Valid Visa Credit Card Number. PL/SQL procedure successfully completed.
Ver también:
- Valide la dirección de correo electrónico utilizando PL/SQL en Oracle