Re: [oracle_br] Função para Validar CPF e CNPJ

2012-03-07 Por tôpico Yuri Menon
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

2012-03-07 Por tôpico CLEYDSON BORGES
-- 
* --
-- 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