Formatando CPF ou CNPJ no SQL Server e Oracle!

Esses dias, me bati com um problema quando desenvolvia melhorias de um sistema de terceiros.

Na tabela, um dos campos “guardava” CPF e CNPJ ao mesmo tempo. Até aquele momento, não tinha problema algum, já que era mostrado pelo nome do Cliente/Fornecedor e não por números formatados.  Porém, não se atentaram ao fato de um fornecedor com o mesmo nome, pode ter CNPJ diferentes.

Como mostrava a partir de uma view no Sql Server 2008, o problema apareceu. Dessa forma, tive que criar uma função para que ao chamar o campo, o banco reconhecesse o tipo de número (CPF ou CNPJ) e o formatasse.

Antes, eu pensei em fazer diretamente na consulta do SQL Server, que ficaria dessa forma:

  1. SELECT TOP (100) PERCENT
  2. CASE WHEN (LEN(CNPJ_CPF) <= 11) THEN
  3. SUBSTRING(CNPJ_CPF, 1, 3) + '.' +
  4. SUBSTRING(CNPJ_CPF, 4, 3) + '.' +
  5. SUBSTRING(CNPJ_CPF, 7, 3) + '-' +
  6. SUBSTRING(CNPJ_CPF, 10, 2)
  7. WHEN (LEN(CNPJ_CPF) > 11) THEN
  8. SUBSTRING(CNPJ_CPF, 1, 2) + '.' +
  9. SUBSTRING(CNPJ_CPF, 3, 3) + '.' +
  10. SUBSTRING(CNPJ_CPF, 6, 3) + '/' +
  11. SUBSTRING(CNPJ_CPF, 9, 4) + '-' +
  12. SUBSTRING(CNPJ_CPF, 13, 2)
  13. ELSE
  14. CNPJ_CPF END AS Fornecedor
  15. FROM Fornecedores

Pronto, ele já reconhecia o formato, e trazia formatado como devia.

Porém, eu gostaria de usar em outros modelos e casos que precisasse. Então resolvi traduzir isso para uma Function genérica, que me permitia chamar diretamente de qualquer campo que precisasse.

Não é complexa, e ficou dessa forma:

  1. CREATE FUNCTION FORMATAR_CPF_CNPJ (@VALOR VARCHAR(20))
  2. RETURNS VARCHAR(20)
  3. AS
  4. BEGIN
  5. DECLARE @RESULTADO VARCHAR(20)
  6.  
  7. IF LEN(@VALOR)<= 11
  8. BEGIN
  9. SELECT @RESULTADO=SUBSTRING(@VALOR, 1, 3)+ '.' +
  10. SUBSTRING(@VALOR, 4, 3)+ '.' +
  11. SUBSTRING(@VALOR, 7, 3)+ '-' +
  12. SUBSTRING(@VALOR, 10, 2)
  13. END
  14.  
  15. ELSE
  16.  
  17. BEGIN
  18. SELECT @RESULTADO=SUBSTRING(@VALOR, 1, 2)+ '.' +
  19. SUBSTRING(@VALOR, 3, 3)+ '.' +
  20. SUBSTRING(@VALOR, 6, 3)+ '/' +
  21. SUBSTRING(@VALOR, 9, 4)+ '-' +
  22. SUBSTRING(@VALOR, 13, 2)
  23. END
  24.  
  25. RETURN (@RESULTADO)
  26.  
  27. END
  28.  
  29. GO

Agora, com a função criada, para testar use o seguinte código:

SELECT dbo.FORMATAR_CPF_CNPJ('00111111111111') AS FORNECEDOR

Simples não?

No Oracle, também é possível fazer o mesmo com uma função:

FUNCTION Formatar_CPF_CNPJ (Valor VARCHAR2) RETURN VARCHAR2 IS Result VARCHAR2(20);
   BEGIN
     IF LENGTH(Valor) > 11 THEN
 
      result := SUBSTR(Valor,1,2)||'.'||
                  SUBSTR(Valor,3,3)||'.'||
                  SUBSTR(Valor,6,3)||'/'||
                  SUBSTR(Valor,9,4)||'-'||
                  SUBSTR(Valor,13,2);
 
     ELSE
 
     result := SUBSTR(Valor,1,3)||'.'||
                  SUBSTR(Valor,4,3)||'.'||
                  SUBSTR(Valor,7,3)||'-'||
                  SUBSTR(Valor,10,2);
 
     END IF;
 
    RETURN(Result);
 
   END Formatar_CPF_CNPJ;

Bacana né? Espero que esse código ajude! ;)

Related Posts with Thumbnails