Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да потвърдите номера на кредитна карта и да идентифицирате нейния тип с помощта на PL/SQL?

Тук давам пример за съхранена в 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
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Неща, които трябва да знаете, преди да научите Oracle

  2. Как да знам идентификатора, преди да запиша обект в jpa

  3. Преобразуване на интервала в минути

  4. Oracle Комбинирайте няколко колони в една

  5. 3 начина за форматиране на число до 2 знака след десетичната запетая в Oracle