Validar CPF/CNPJ mySQL
Autor: Márcio Tadeu | Publicado: 2012-01-03T16:07:00-02:00


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.&nbsp;



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, exatamente hoje, quero essa resposta independente de linguagem, via banco de dados. Então, vamos a ela.



Para isso, basta criarmos uma função. Neste caso vou dar o nome de validarCpf.&nbsp;

CREATE FUNCTION `validarCpf`(CPF CHAR(14)) RETURNS double
BEGIN
&nbsp;&nbsp;&nbsp; DECLARE INDICE INT;
&nbsp;&nbsp;&nbsp; DECLARE SOMA INT;
&nbsp;&nbsp;&nbsp; DECLARE DIG1 INT;
&nbsp;&nbsp;&nbsp; DECLARE DIG2 INT;
&nbsp;&nbsp;&nbsp; DECLARE CPF_TEMP VARCHAR(11);
&nbsp;&nbsp;&nbsp; DECLARE DIGITOS_IGUAIS CHAR(1);
&nbsp;&nbsp;&nbsp; DECLARE RESULTADO CHAR(1);

&nbsp;&nbsp;&nbsp; SET RESULTADO = FALSE;

&nbsp;&nbsp;&nbsp; /*
&nbsp;&nbsp;&nbsp; Verificando se os dígitos são iguais
&nbsp;&nbsp;&nbsp; */

&nbsp;&nbsp;&nbsp; SET CPF_TEMP = SUBSTRING(CPF,1,1);

&nbsp;&nbsp;&nbsp; SET INDICE = 1;
&nbsp;&nbsp;&nbsp; SET DIGITOS_IGUAIS = 'S';

&nbsp; IF (LENGTH(CPF)&gt;11) THEN
&nbsp;&nbsp;&nbsp; SET DIGITOS_IGUAIS = 'S';
&nbsp; ELSE
&nbsp;&nbsp;&nbsp; SET DIG1=LENGTH(CPF);
&nbsp;&nbsp;&nbsp; WHILE (DIG1&lt;=12) DO
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET CPF=CONCAT("0",CPF);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET DIG1=DIG1+1;
&nbsp;&nbsp;&nbsp; END WHILE;
&nbsp;&nbsp;&nbsp; SET CPF=RIGHT(CPF,11);
&nbsp; &nbsp;&nbsp;&nbsp; WHILE (INDICE &lt;= 11) DO
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IF (SUBSTRING(CPF,INDICE,1) &lt;&gt; CPF_TEMP) Then
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET DIGITOS_IGUAIS = 'N';
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END IF;
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET INDICE = INDICE + 1;
&nbsp; &nbsp;&nbsp;&nbsp; END WHILE;
&nbsp; END IF;

&nbsp;&nbsp;&nbsp; /*Caso os dígitos não sejam todos iguais Começo o calculo do dígitos*/
&nbsp;&nbsp;&nbsp; IF (DIGITOS_IGUAIS = 'N') THEN
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*Cálculo do 1º dígito*/
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET SOMA = 0;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET INDICE = 1;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WHILE (INDICE &lt;= 9) DO &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET Soma = Soma + CAST(SUBSTRING(CPF,INDICE,1) AS UNSIGNED) * (11 - INDICE); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET INDICE = INDICE + 1; &nbsp;&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END WHILE; &nbsp;&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET DIG1 = 11 - (SOMA % 11); &nbsp;&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF (DIG1 &gt; 9) THEN
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET DIG1 = 0;
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; END IF;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; -- Cálculo do 2º dígito }
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET SOMA = 0;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET INDICE = 1;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WHILE (INDICE &lt;= 10) DO
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET Soma = Soma + CAST(SUBSTRING(CPF,INDICE,1) AS UNSIGNED) * (12 - INDICE); &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET INDICE = INDICE + 1;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END WHILE;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET DIG2 = 11 - (SOMA % 11);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IF DIG2 &gt; 9 THEN
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET DIG2 = 0;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END IF;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; -- Validando
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IF (DIG1 = SUBSTRING(CPF,LENGTH(CPF)-1,1)) AND (DIG2 = SUBSTRING(CPF,LENGTH(CPF),1)) THEN
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET RESULTADO = TRUE;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ELSE
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET RESULTADO = FALSE;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END IF;

&nbsp;&nbsp;&nbsp; END IF;
&nbsp;&nbsp;&nbsp; RETURN RESULTADO;
END

Isto posto, tá resolvido o problema. Esta função não foi criada por mim. Eu já utilizo a bastante tempo e foi encontrada no blog do Robson Faria