Ir ao conteúdo

Validar CPF no PL/SQL


marcelo.zangao

Posts recomendados

  • 1 ano depois...
Postado
Como faço um bloco anônimo para validar CPF no PL/SQL usando char(11) e usando string para verificar os dígitos verificadores?

Códigos de rotinas PL/SQL para validação de campos específicos

• CNPJ

• CPF

• NIT

• PIS / PASEP

--------------------------------------------------------------------------------

CNPJ

CREATE OR REPLACE

FUNCTION fc_valida_cnpj (cnpj IN VARCHAR2)

RETURN BOOLEAN

IS

digito NUMBER := 0;

soma NUMBER := 0;

cnpj_limpo VARCHAR2 (14) := TRIM (cnpj);

BEGIN

IF LENGTH (cnpj_limpo) <> 14

THEN

RETURN FALSE;

END IF;

FOR i IN 1 .. 4

LOOP

soma := soma + SUBSTR (cnpj_limpo, i, 1) * (6 - i);

END LOOP;

FOR i IN 5 .. 12

LOOP

soma := soma + SUBSTR (cnpj_limpo, i, 1) * (14 - i);

END LOOP;

digito := 11 - MOD (soma, 11);

IF digito > 9

THEN

digito := 0;

END IF;

IF digito != SUBSTR (cnpj_limpo, 13, 1)

THEN

RETURN FALSE;

END IF;

digito := 0;

soma := 0;

FOR i IN 1 .. 5

LOOP

soma := soma + SUBSTR (cnpj_limpo, i, 1) * (7 - i);

END LOOP;

FOR i IN 6 .. 13

LOOP

soma := soma + SUBSTR (cnpj_limpo, i, 1) * (15 - i);

END LOOP;

digito := 11 - MOD (soma, 11);

IF digito > 9

THEN

digito := 0;

END IF;

IF digito != SUBSTR (cnpj_limpo, 14, 1)

THEN

RETURN FALSE;

END IF;

RETURN TRUE;

END fc_valida_cnpj;

Página de informações ao usuário Topo desta página

--------------------------------------------------------------------------------

CPF

CREATE OR REPLACE

FUNCTION fc_valida_cpf (p_cpf IN CHAR)

RETURN BOOLEAN

IS

m_total NUMBER := 0;

m_digito NUMBER := 0;

BEGIN

FOR i IN 1 .. 9

LOOP

m_total := m_total + SUBSTR (p_cpf, i, 1) * (11 - i);

END LOOP;

m_digito := 11 - MOD (m_total, 11);

IF m_digito > 9

THEN

m_digito := 0;

END IF;

IF m_digito != SUBSTR (p_cpf, 10, 1)

THEN

RETURN FALSE;

END IF;

m_digito := 0;

m_total := 0;

FOR i IN 1 .. 10

LOOP

m_total := m_total + SUBSTR (p_cpf, i, 1) * (12 - i);

END LOOP;

m_digito := 11 - MOD (m_total, 11);

IF m_digito > 9

THEN

m_digito := 0;

END IF;

IF m_digito != SUBSTR (p_cpf, 11, 1)

THEN

RETURN FALSE;

END IF;

RETURN TRUE;

END fc_valida_cpf;

Página de informações ao usuário Topo desta página

--------------------------------------------------------------------------------

NIT

CREATE OR REPLACE

FUNCTION fc_valida_nit (nit IN VARCHAR2)

RETURN BOOLEAN

IS

m11 PLS_INTEGER;

soma PLS_INTEGER;

dv PLS_INTEGER;

digito PLS_INTEGER;

i PLS_INTEGER := 0;

nit_limpo VARCHAR2 (11) := TRIM (nit);

BEGIN

IF LENGTH (nit_limpo) <> 11

THEN

RETURN FALSE;

END IF;

dv := SUBSTR (nit_limpo, 11, 1);

soma := 0;

m11 := 2;

WHILE i < 10

LOOP

i := i + 1;

soma := soma + (m11 * SUBSTR (nit_limpo, 11 - i, 1));

IF m11 < 9

THEN

m11 := m11 + 1;

ELSE

m11 := 2;

END IF;

digito := 11 - (soma MOD 11);

IF digito > 9

THEN

digito := 0;

END IF;

END LOOP;

IF dv = digito

THEN

RETURN TRUE;

ELSE

RETURN FALSE;

END IF;

END fc_valida_nit;

Página de informações ao usuário Topo desta página

--------------------------------------------------------------------------------

PIS/PASEP

CREATE OR REPLACE

FUNCTION fc_valida_pispasep(PIS_NUM VARCHAR2) RETURN BOOLEAN IS

ERRO_PIS VARCHAR2(1); -- RECEBE 'N' PARA PIS CORRETO E 'S' CASO CONTRÁRIO

SOMATORIO NUMBER; -- P/ CALCULAR SOMA

POS_PIS NUMBER; -- PARA PERCORRER A STRING

PESO_PIS NUMBER; -- MULTIPLICADOR

INT_PIS NUMBER; -- VARIAVEL AUXILIAR

MODULO_PIS NUMBER; -- VARIAVEL AUXILIAR

BEGIN

IF NVL(LENGTH(PIS_NUM), 0) <> 11 THEN

RETURN FALSE;

ELSE

ERRO_PIS := 'N';

SOMATORIO := 0;

POS_PIS := 1;

PESO_PIS := 3;

WHILE POS_PIS < 3 LOOP

INT_PIS := TO_NUMBER(SUBSTR(PIS_NUM, POS_PIS, 1)) * PESO_PIS;

SOMATORIO := SOMATORIO + INT_PIS;

PESO_PIS := PESO_PIS - 1;

POS_PIS := POS_PIS + 1;

END LOOP;

PESO_PIS := 9;

WHILE POS_PIS < 11 LOOP

INT_PIS := TO_NUMBER(SUBSTR(PIS_NUM, POS_PIS, 1)) * PESO_PIS;

SOMATORIO := SOMATORIO + INT_PIS;

PESO_PIS := PESO_PIS - 1;

POS_PIS := POS_PIS + 1;

END LOOP;

INT_PIS := MOD(SOMATORIO, 11);

IF INT_PIS < 2 THEN

INT_PIS := 11;

END IF;

MODULO_PIS := 11 - INT_PIS;

IF MODULO_PIS <> TO_NUMBER(SUBSTR(PIS_NUM, 11, 1)) THEN

ERRO_PIS := 'S';

ELSE

POS_PIS := 1;

WHILE POS_PIS < 11 LOOP

INT_PIS := POS_PIS + 1;

IF SUBSTR(PIS_NUM, POS_PIS, 1) <> SUBSTR(PIS_NUM, INT_PIS, 1) THEN

ERRO_PIS := 'N';

POS_PIS := 11;

ELSE

POS_PIS := POS_PIS + 1;

END IF;

END LOOP;

END IF;

IF ERRO_PIS = 'S' THEN

RETURN FALSE;

ELSE

RETURN TRUE;

END IF;

END IF;

END;

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!