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; /