Re: [oracle_br] Função para Validar CPF e CNPJ
Apenas, adicionando A função a seguir, promete validar tanto CPF como CNPJ. obs: ainda não testei! create or replace FUNCTION VALIDA_CPF_CNPJ(V_CPF_CNPJ VARCHAR2) RETURN CHAR IS TYPE ARRAY_DV IS VARRAY(2) OF PLS_INTEGER; V_ARRAY_DV ARRAY_DV := ARRAY_DV(0, 0); CPF_DIGIT CONSTANT PLS_INTEGER := 11; CNPJ_DIGIT CONSTANT PLS_INTEGER := 14; IS_CPF BOOLEAN; IS_CNPJ BOOLEAN; V_CPF_NUMBER VARCHAR2(20); TOTALNUMBER := 0; COEFICIENTE NUMBER := 0; DV1NUMBER := 0; DV2NUMBER := 0; DIGITO NUMBER := 0; J INTEGER; I INTEGER; BEGIN IF V_CPF_CNPJ IS NULL THEN RETURN '0'; END IF; /* Retira os caracteres não numéricos do CPF/CNPJ caso seja enviado para validação um valor com a máscara. */ V_CPF_NUMBER := REGEXP_REPLACE(V_CPF_CNPJ, '[^0-9]'); /* Verifica se o valor passado é um CPF através do número de dígitos informados. CPF = 11 */ IS_CPF := (LENGTH(V_CPF_NUMBER) = CPF_DIGIT); /* Verifica se o valor passado é um CNPJ através do número de dígitos informados. CNPJ = 14 */ IS_CNPJ := (LENGTH(V_CPF_NUMBER) = CNPJ_DIGIT); IF (IS_CPF OR IS_CNPJ) THEN TOTAL := 0; ELSE RETURN '0'; END IF; /* Armazena os valores de dígitos informados para posterior comparação com os dígitos verificadores calculados. */ DV1 := TO_NUMBER(SUBSTR(V_CPF_NUMBER, LENGTH(V_CPF_NUMBER) - 1, 1)); DV2 := TO_NUMBER(SUBSTR(V_CPF_NUMBER, LENGTH(V_CPF_NUMBER), 1)); V_ARRAY_DV(1) := 0; V_ARRAY_DV(2) := 0; /* Laço para cálculo dos dígitos verificadores. É utilizado módulo 11 conforme norma da Receita Federal. */ FOR J IN 1 .. 2 LOOP TOTAL := 0; COEFICIENTE := 2; FOR I IN REVERSE 1 .. ((LENGTH(V_CPF_NUMBER) - 3) + J) LOOP DIGITO := TO_NUMBER(SUBSTR(V_CPF_NUMBER, I, 1)); TOTAL := TOTAL + (DIGITO * COEFICIENTE); COEFICIENTE := COEFICIENTE + 1; IF (COEFICIENTE > 9) AND IS_CNPJ THEN COEFICIENTE := 2; END IF; END LOOP; --for i V_ARRAY_DV(J) := 11 - MOD(TOTAL, 11); IF (V_ARRAY_DV(J) >= 10) THEN V_ARRAY_DV(J) := 0; END IF; END LOOP; --for j in 1..2 /* Compara os dígitos calculados com os informados para informar resultado. */ IF (DV1 = V_ARRAY_DV(1)) AND(DV2 = V_ARRAY_DV(2)) THEN RETURN '1'; END IF; RETURN '0'; END VALIDA_CPF_CNPJ; Em 6 de março de 2012 22:40, CLEYDSON BORGES escreveu: > -- > * > -- > -- Funcao: > Calcula_Digito_DOC-- > -- > -- > -- > Entrada: > -- > -- Tipo : determina que documento deve ser > validado.-- > -- Valores validos sao: 'CGC' ou > 'CPF'. -- > -- Numero : numero do documento, com 13 digitos, com zeros a > esquerda. -- > -- O numero do documento nao deve estar formatado, nem > incluir -- > -- os digitos de verificacao. Deve ser constituido apenas > por -- > -- > digitos.-- > -- > -- > -- > Saida: > -- > -- Digito de verificacao do CGC ou > CPF. -- > -- Ou 'ER' se o documento especificado nao e' nem CGC, nem > CPF. -- > -- > * > -- > -- > Objetivo: > -- > -- Calcular os digitos de verificacao do CGC ou CPF > especificado. -- > -- > * > -- > -- > Autoria: > -- > -- Raissa M. M. Lopes - ralo...@br.oracle.com > -- > -- > -- > -- Data de Criacao: 26.09.1996 Versao: > 1-- > -- > * > -- > create or replace function Calcula_Digito_DOC > ( >TipoIN varchar2, >Numero IN varchar2 > ) > RETURN varchar2 > IS >Primeiro_Dignumber; >Segundo_Dig number; > BEGIN >IF Tipo = 'CPF' THEN > >Primeiro_Dig := 11 - MOD (TO_NUMBER(SUBSTR(Numero,13,1) * > 2) + > TO_NUMBER(SUBSTR(Numero,12,1) * > 3) + > TO_NUMBER(SUBSTR(Numero,11,1) * > 4) + > TO_NUMBER(SUBSTR(Numero,10,1) * > 5) + > TO_NUMBER(SUBSTR(Numero,9,1) * > 6) + > TO_NUMBER(SUBSTR(Numero,8,1) * > 7) + > TO_NUMBER(SUBSTR(Numero,7,1) * > 8) + > TO_NUMBER(SUBSTR(Numero,6,1) * > 9) + > TO_NUMBER(SUBSTR(Numero,5,1) *
Re: [oracle_br] Função para Validar CPF e CNPJ
-- * -- -- Funcao: Calcula_Digito_DOC-- -- -- -- Entrada: -- -- Tipo : determina que documento deve ser validado.-- -- Valores validos sao: 'CGC' ou 'CPF'. -- -- Numero : numero do documento, com 13 digitos, com zeros a esquerda. -- -- O numero do documento nao deve estar formatado, nem incluir -- -- os digitos de verificacao. Deve ser constituido apenas por -- -- digitos.-- -- -- -- Saida:-- -- Digito de verificacao do CGC ou CPF. -- -- Ou 'ER' se o documento especificado nao e' nem CGC, nem CPF. -- -- * -- -- Objetivo: -- -- Calcular os digitos de verificacao do CGC ou CPF especificado. -- -- * -- -- Autoria: -- -- Raissa M. M. Lopes - ralo...@br.oracle.com -- -- -- -- Data de Criacao: 26.09.1996 Versao: 1-- -- * -- create or replace function Calcula_Digito_DOC ( TipoIN varchar2, Numero IN varchar2 ) RETURN varchar2 IS Primeiro_Dignumber; Segundo_Dig number; BEGIN IF Tipo = 'CPF' THEN Primeiro_Dig := 11 - MOD (TO_NUMBER(SUBSTR(Numero,13,1) * 2) + TO_NUMBER(SUBSTR(Numero,12,1) * 3) + TO_NUMBER(SUBSTR(Numero,11,1) * 4) + TO_NUMBER(SUBSTR(Numero,10,1) * 5) + TO_NUMBER(SUBSTR(Numero,9,1) * 6) + TO_NUMBER(SUBSTR(Numero,8,1) * 7) + TO_NUMBER(SUBSTR(Numero,7,1) * 8) + TO_NUMBER(SUBSTR(Numero,6,1) * 9) + TO_NUMBER(SUBSTR(Numero,5,1) * 10), 11); if (Primeiro_Dig = 11) or (Primeiro_Dig = 10) then Primeiro_Dig := 0; end if; Segundo_Dig := 11 - MOD (Primeiro_Dig * 2 + TO_NUMBER (SUBSTR(Numero,13,1) * 3) + TO_NUMBER (SUBSTR(Numero,12,1) * 4) + TO_NUMBER (SUBSTR(Numero,11,1) * 5) + TO_NUMBER (SUBSTR(Numero,10,1) * 6) + TO_NUMBER (SUBSTR(Numero,9,1) * 7) + TO_NUMBER (SUBSTR(Numero,8,1) * 8) + TO_NUMBER (SUBSTR(Numero,7,1) * 9) + TO_NUMBER (SUBSTR(Numero,6,1) * 10) + TO_NUMBER (SUBSTR(Numero,5,1) * 11), 11); if (Segundo_Dig = 11) or (Segundo_Dig = 10) THEN Segundo_Dig := 0; end if; Return (CONCAT(TO_CHAR(Primeiro_Dig),TO_CHAR(Segundo_Dig))); ELSIF Tipo = 'CGC' THEN Primeiro_Dig := (11 - MOD (TO_NUMBER(SUBSTR(Numero,13,1) * 2) + TO_NUMBER(SUBSTR(Numero,12,1) * 3) + TO_NUMBER(SUBSTR(Numero,11,1) * 4) + TO_NUMBER(SUBSTR(Numero,10,1) * 5) + TO_NUMBER(SUBSTR(Numero,9,1) * 6) + TO_NUMBER(SUBSTR(Numero,8,1) * 7) + TO_NUMBER(SUBSTR(Numero,7,1) * 8) + TO_NUMBER(SUBSTR(Numero,6,1) * 9) + TO_NUMBER(SUBSTR(Numero,5,1) * 2) + TO_NUMBER(SUBSTR(Numero,4,1) * 3) + TO_NUMBER(SUBSTR(Numero,3,1) * 4) + TO_NUMBER(SUBSTR(Numero,2,1) * 5), 11)); if (Primeiro_Dig = 11) or (Primeiro_Dig = 10) then Primeiro_Dig := 0; end if; Segundo_Dig := (11 - MOD