dw
Database
Tables
(current)
Columns
Constraints
Relationships
Orphan Tables
Anomalies
Routines
validar_cnpj
Parameters
Name
Type
Mode
cnpj_input
text
IN
Definition
DECLARE cnpj_limpo text; i INTEGER; soma INTEGER; resto INTEGER; digito1 INTEGER; digito2 INTEGER; pesos1 INTEGER[] := ARRAY[5,4,3,2,9,8,7,6,5,4,3,2]; pesos2 INTEGER[] := ARRAY[6,5,4,3,2,9,8,7,6,5,4,3,2]; BEGIN -- Remove tudo que não for número cnpj_limpo := regexp_replace(cnpj_input, '[^0-9]', '', 'g'); -- Verifica se tem 14 dígitos IF length(cnpj_limpo) <> 14 THEN RETURN FALSE; END IF; -- Verifica se todos os dígitos são iguais (caso inválido) IF cnpj_limpo ~ '^(.)\1{13}$' THEN RETURN FALSE; END IF; -- Calcula o primeiro dígito verificador soma := 0; FOR i IN 1..12 LOOP soma := soma + (cast(substring(cnpj_limpo, i, 1) AS INTEGER) * pesos1[i]); END LOOP; resto := soma % 11; IF resto < 2 THEN digito1 := 0; ELSE digito1 := 11 - resto; END IF; -- Calcula o segundo dígito verificador soma := 0; FOR i IN 1..13 LOOP soma := soma + (cast(substring(cnpj_limpo, i, 1) AS INTEGER) * pesos2[i]); END LOOP; resto := soma % 11; IF resto < 2 THEN digito2 := 0; ELSE digito2 := 11 - resto; END IF; -- Compara os dígitos calculados com os dígitos do CNPJ informado IF digito1 = cast(substring(cnpj_limpo, 13, 1) AS INTEGER) AND digito2 = cast(substring(cnpj_limpo, 14, 1) AS INTEGER) THEN RETURN TRUE; ELSE RETURN FALSE; END IF; END;