Тук давам пример за съхранена в PL/SQL функция за валидиране на номера на кредитна карта и идентифициране на нейния тип, независимо дали е кредитна карта Visa, MasterCard или American Express. Проверявам номера на кредитната карта с помощта на алгоритъма LUHN, който се използва за валидиране на различни идентификационни номера. Ако номерът на кредитна карта е валиден, тогава функцията проверява за неговия тип.
Пример за PL/SQL функция за валидиране на номера на кредитна карта и нейния тип в Oracle
Следната функция приема аргумент като номер на кредитна карта и след това потвърждава номера с помощта на алгоритъма на Luhn и връща неговия тип. В момента тази функция PL/SQL поддържа три вида кредитни карти, които са Visa, MasterCard и American Express. Можете да промените, за да добавите още типове кредитни карти. Функцията 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; Тест
Променете 4047xxxxxxxxxxxx низа по-долу с номера на кредитната си карта Visa, MasterCard или Amex, за да тествате.
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.
Забележка: Тествайте внимателно, преди да внедрите в приложението си.
Вижте също:
- Проверете имейл адреса с помощта на PL/SQL в Oracle