Categorias

Funções para Validar e Gerar CPFs

Esse pacote de funções disponibiliza um conjunto de instruções para trabalhar com CPF, incluindo validação de CPF e geração de CPF aleatório. Segue também uma função que remove todos os caracteres não numéricos de um texto.

CREATE OR REPLACE PACKAGE PKG_CPF IS
/*PEDRO ZATTA - 05/02/2010*/

  FUNCTION SOMENTE_NUMEROS ( PCPF VARCHAR2 ) RETURN VARCHAR2 ;
  FUNCTION VALIDA_CPF ( PCPF VARCHAR2 ) RETURN NUMBER ;
  FUNCTION CALCULA_DIGITOS ( PCPF NUMBER ) RETURN VARCHAR2 ;
  FUNCTION GERA_CPF RETURN VARCHAR2;
      
END PKG_CPF; 
/

CREATE OR REPLACE PACKAGE BODY PKG_CPF IS

  FUNCTION SOMENTE_NUMEROS ( PCPF VARCHAR2 ) RETURN VARCHAR2  IS
        VCOUNT NUMBER;
        VCPF VARCHAR2(11);
  BEGIN
  
    VCOUNT := TO_NUMBER(PCPF);
    RETURN PCPF;
  
  EXCEPTION
      WHEN OTHERS THEN
        VCOUNT := 0;
        while vcount < length(PCPF) loop
            vcount := vcount +1;
            IF substr(PCPF,vcount,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN
                VCPF := VCPF||substr(PCPF,vcount,1);
            END IF;
        
        end loop; 
    
        RETURN VCPF;
    
  END SOMENTE_NUMEROS;

  FUNCTION CALCULA_DIGITOS ( PCPF NUMBER ) RETURN VARCHAR2  IS
    vcount number;
    VDIGITO NUMBER;
    VCPF VARCHAR(11);
  BEGIN

    VCPF := LPAD(PCPF,9,'0'); 

    vcount := 0;
    VDIGITO := 0;
    while vcount < length(VCPF) loop
        vcount := vcount +1;
        VDIGITO := VDIGITO + (substr(VCPF,vcount,1) *(11-VCOUNT) );
    end loop; 
 
    VDIGITO := MOD(VDIGITO,11);
    IF VDIGITO < 2 THEN
        VDIGITO := 0;
    ELSE
        VDIGITO := 11-VDIGITO;
    END IF;  
    VCPF := VCPF||VDIGITO;

    vcount := 0;
    VDIGITO := 0;
    while vcount < length(VCPF) loop
        vcount := vcount +1;
        VDIGITO := VDIGITO + (substr(VCPF,vcount,1) *(12-VCOUNT) );
    end loop; 

    VDIGITO := MOD(VDIGITO,11);

    IF VDIGITO < 2 THEN
        VDIGITO := 0;
    ELSE
        VDIGITO := 11-VDIGITO;
    END IF;   
    VCPF := VCPF||VDIGITO;

    RETURN SUBSTR(VCPF,10,2); 

  END CALCULA_DIGITOS;
  

  FUNCTION VALIDA_CPF ( PCPF VARCHAR2 ) RETURN NUMBER  IS
        VCPF VARCHAR2(11);
        VDIGITOS VARCHAR2(2);
        VDIGITOS_AUX VARCHAR2(2);
  BEGIN
        VCPF := SOMENTE_NUMEROS(PCPF);
        VCPF := LPAD(VCPF,11,'0');
        
        IF CALCULA_DIGITOS(SUBSTR(VCPF,1,9)) = SUBSTR(VCPF,10,2) THEN
            RETURN 1;
        ELSE
            RETURN -1;
        END IF; 

  EXCEPTION
    WHEN OTHERS THEN
        RETURN -10;
  END VALIDA_CPF;

  FUNCTION GERA_CPF RETURN VARCHAR2  IS
        VCPF NUMBER(11);

  BEGIN

    select round(DBMS_RANDOM.VALUE(0,999999999)) into VCPF 
    from dual;

    RETURN VCPF*100 + CALCULA_DIGITOS(VCPF); 

  END GERA_CPF;


END PKG_CPF; 
/

Arquivos para Download:

PKG_CPF.pksPKG_CPF.pkb