jsampaio 0 Denunciar post Postado Maio 9, 2005 Olá Pessoal !Alguém tem algum código pl/sql que valida se o número de catão de crédito é valido ou inválido ?Grato,Jsampaio Compartilhar este post Link para o post Compartilhar em outros sites
alphamek 2 Denunciar post Postado Maio 9, 2005 Olá, Esse aqui é baseado no algoritmo LUHM. Veja se serve pra ti. FUNCTION cc_fingerprint ( p_ccn VARCHAR2 ) RETURN VARCHAR2 IS ccn VARCHAR2 (400) := nosymbols (p_ccn, LENGTH (p_ccn)); clen NUMBER := LENGTH (ccn); tot NUMBER := 0; val NUMBER := 0; c1 NUMBER; c2 NUMBER; c3 NUMBER; c4 NUMBER; ctype VARCHAR2 (160) := 'CARD'; calg VARCHAR2 (160) := 'UNKNOWN'; result VARCHAR2 (160); ----- BEGIN ccn := REPLACE (LTRIM (RTRIM (ccn)), ' ', ''); IF isnumber (ccn) = 0 THEN c1 := TO_NUMBER (SUBSTR (ccn, 1, 1)); c2 := TO_NUMBER (SUBSTR (ccn, 1, 2)); c3 := TO_NUMBER (SUBSTR (ccn, 1, 3)); c4 := TO_NUMBER (SUBSTR (ccn, 1, 4)); IF clen = 13 THEN IF c1 IN (4) THEN ctype := 'VISA'; calg := 'MOD10'; END IF; ELSIF clen = 14 THEN IF c2 IN (36, 38) THEN ctype := 'DINERS CLUB/CARTE BLANCHE'; calg := 'MOD10'; ELSIF c3 IN (300, 301, 302, 303, 304, 305) THEN ctype := 'DINERS CLUB/CARTE BLANCHE'; calg := 'MOD10'; END IF; ELSIF clen = 15 THEN IF c2 IN (34, 37) THEN ctype := 'AMEX'; calg := 'MOD10'; ELSIF c4 IN (2014, 2149) THEN ctype := 'enROUTE'; calg := 'ANY'; ELSIF c4 IN (2131, 1800) THEN ctype := 'JBC'; calg := 'MOD10'; END IF; ELSIF clen = 16 THEN IF c1 IN (4) THEN ctype := 'VISA'; calg := 'MOD10'; ELSIF c1 IN (3) THEN ctype := 'JBC'; calg := 'MOD10'; ELSIF c2 IN (51, 52, 53, 54, 55) THEN ctype := 'MASTERCARD'; calg := 'MOD10'; ELSIF c4 IN (6011) THEN ctype := 'DISCOVER'; calg := 'MOD10'; END IF; END IF; IF calg = 'MOD10' THEN FOR i IN REVERSE 1 .. LENGTH (ccn) LOOP IF TO_NUMBER (SUBSTR (TO_CHAR (i), LENGTH (i), 1)) IN (1, 3, 5, 7, 9) THEN val := SUBSTR (ccn, i, 1) * 2; tot := tot + SUBSTR (val, 1, 1); tot := tot + NVL (SUBSTR (val, 2, 1), 0); ELSE tot := tot + SUBSTR (ccn, i, 1); END IF; END LOOP; IF MOD (tot, 10) = 0 THEN result := 'VALID'; ELSE result := 'INVALID'; END IF; ELSIF calg = 'ANY' THEN -----any number is valid for card result := 'VALID'; ELSE -----card type unknown, therefore fingerprint unknown result := 'UNKNOWN'; END IF; result := result || ' ' || ctype || ' FINGERPRINT'; ELSE result := 'CARD CONTAINS NON NUMERIC SYMBOLS'; END IF; RETURN (result); END; Abraços, :lol: Compartilhar este post Link para o post Compartilhar em outros sites