sql >> Database teknologi >  >> RDS >> Oracle

Hvordan validerer man kreditkortnummer og identificerer dets type ved hjælp af PL/SQL?

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
  1. Arbejder med Salesforce.com i Alpha Anywhere

  2. Måneder mellem to datoer

  3. SQL Server AlwaysOn Tilgængelighedsgrupper:Installation og konfiguration, del 1

  4. Hvordan beregnes forskellen i timer (decimal) mellem to datoer i SQL Server?