Validar CPF/CNPJ no MySQL
Muito comum nos cadastros de clientes, fornecedores, transportadoras ou seja lá o que for, é colocar em um mesmo campo o CPF ou o CNPJ que estamos cadastrando. Como tudo na vida tem o lado bom e o ruim, aqui não vai ser diferente. Um do problemas, é saber se aquele cadastro é de pessoa física ou jurídica. Mas pra que eu quero saber isso? Como diz a propaganda de uma operadora, não são as respostas que fazem o mundo girar, mas sim as perguntas.
Como o MySQL não faz isso de uma forma automática, poderemos ter isso via programação do sistema pois tem inúmeras funções para detectar isso seja em PHP, ASP, JAVA ou qualquer que seja a linguagem. Mas hoje essa resposta virá via banco de dados. Então, vamos a ela.
Para isso, basta criarmos uma função. Neste caso vou dar o nome de validarCpf.
CREATE FUNCTION `validarCpf`(CPF CHAR(14)) RETURNS double
BEGIN
DECLARE INDICE INT;
DECLARE SOMA INT;
DECLARE DIG1 INT;
DECLARE DIG2 INT;
DECLARE CPF_TEMP VARCHAR(11);
DECLARE DIGITOS_IGUAIS CHAR(1);
DECLARE RESULTADO CHAR(1);
SET RESULTADO = FALSE;
/*
Verificando se os dígitos são iguais
*/
SET CPF_TEMP = SUBSTRING(CPF,1,1);
SET INDICE = 1;
SET DIGITOS_IGUAIS = ‘S’;
IF (LENGTH(CPF)>11) THEN
SET DIGITOS_IGUAIS = ‘S’;
ELSE
SET DIG1=LENGTH(CPF);
WHILE (DIG1<=12) DO
SET CPF=CONCAT(“0”,CPF);
SET DIG1=DIG1+1;
END WHILE;
SET CPF=RIGHT(CPF,11);
WHILE (INDICE <= 11) DO
IF (SUBSTRING(CPF,INDICE,1) <> CPF_TEMP) Then
SET DIGITOS_IGUAIS = ‘N’;
END IF;
SET INDICE = INDICE + 1;
END WHILE;
END IF;
/*Caso os dígitos não sejam todos iguais Começo o calculo do dígitos*/
IF (DIGITOS_IGUAIS = ‘N’) THEN
/*Cálculo do 1º dígito*/
SET SOMA = 0;
SET INDICE = 1;
WHILE (INDICE <= 9) DO
SET Soma = Soma + CAST(SUBSTRING(CPF,INDICE,1) AS UNSIGNED) * (11 – INDICE); SET INDICE = INDICE + 1;
END WHILE;
SET DIG1 = 11 – (SOMA % 11);
IF (DIG1 > 9) THEN
SET DIG1 = 0;
END IF;
— Cálculo do 2º dígito }
SET SOMA = 0;
SET INDICE = 1;
WHILE (INDICE <= 10) DO
SET Soma = Soma + CAST(SUBSTRING(CPF,INDICE,1) AS UNSIGNED) * (12 – INDICE); SET INDICE = INDICE + 1;
END WHILE;
SET DIG2 = 11 – (SOMA % 11);
IF DIG2 > 9 THEN
SET DIG2 = 0;
END IF;
— Validando
IF (DIG1 = SUBSTRING(CPF,LENGTH(CPF)-1,1)) AND (DIG2 = SUBSTRING(CPF,LENGTH(CPF),1)) THEN
SET RESULTADO = TRUE;
ELSE
SET RESULTADO = FALSE;
END IF;
END IF;
RETURN RESULTADO;
END
Problema resolvido.