› Fóruns › Banco de dados Oracle › Dados Aleatórios › Dados Aleatórios
Vc pode me dar uma luz? Pois fiz algo parecido com o que vc comentou, mas acaba demorando muito a execução.
create or replace procedure CYBELAR_EXP_TXT_ACSP is
/****************************************************************
* PROCEDURE : CYBELAR_EXP_TXT_ACSP *
* OBJETIVO : Exporta dados de uma tabela para um arquivo texto *
* CRIACAO : 07/01/2010 *
* VERSAO : 1.0 *
* AUTOR : FABIO A. CAMPOS DA CRUZ - *
****************************************************************/
-- DECLARACAO DE VARIAVEIS P/ CONTROLE DO PROCESSO --
ARQ_NRSORTE UTL_FILE.file_type;
VC_LINHA VARCHAR2(8000) := NULL;
VC_ARQ_NOME VARCHAR2(100) := NULL;
VC_DIR_LOG VARCHAR2(50) := NULL;
VC_DIR_OUT VARCHAR2(50) := NULL;
VG_PROCESSO VARCHAR2(100) := 'CYBELAR_EXP_TXT_ACSP';
-- CURSOR PARA GERACAO DO ARQUIVO --
CURSOR CUR_ACSP IS
SELECT p.ACSPCcpf,
P.ACSPDTAB,
P.ACSPINDP,
P.ACSPP06M,
P.ACSPP18M,
P.ACSPNRO,
P.ACSPMDIA,
P.ACSPDVM,
P.ACSPDPM,
P.ACSPNPM,
P.ACSPNROL,
P.ACSPNRC
FROM (SELECT ACSPCCPF,
dv,
cont,
cont_distintos,
val_random,
row_number() OVER(PARTITION BY dv ORDER BY val_random) num_linha,
ACSPDTAB,
ACSPINDP,
ACSPP06M,
ACSPP18M,
ACSPNRO,
ACSPMDIA,
ACSPDVM,
ACSPDPM,
ACSPNPM,
ACSPNROL,
ACSPNRC
FROM (SELECT substr(ACSPCcpf, 7, 2) dv,
ACSPCCPF,
COUNT() OVER(PARTITION BY substr(ACSPCcpf, 7, 2) ORDER BY 0) cont,
COUNT() OVER(ORDER BY 0) cont_distintos,
dbms_random.VALUE val_random,
ACSPDTAB,
ACSPINDP,
ACSPP06M,
ACSPP18M,
ACSPNRO,
ACSPMDIA,
ACSPDVM,
ACSPDPM,
ACSPNPM,
ACSPNROL,
ACSPNRC
FROM CYBELAR_ACSP)
ORDER BY cont,
row_number() OVER(PARTITION BY dv ORDER BY val_random)) p
WHERE num_linha <= (cont * (5000 / cont_distintos));
begin
-- BUSCA DIRETORIO --
BEGIN
SELECT PINT_NM_DIRETORIO_LOG, PINT_NM_DIRETORIO_OUT
INTO VC_DIR_LOG, VC_DIR_OUT
FROM GEMCO_PARAMETRO_INTERFACE PINT, GEMCO_SISTEMA SIST
WHERE PINT.PINT_CD_SISTEMA = SIST.SIST_CD_SISTEMA
AND SIST.SIST_DS_SISTEMA = VG_PROCESSO;
EXCEPTION
-- SE NAO EXISTIR INFORMAR O DIRETORIO ONDE DEVERA SER
-- GERADO O LOG DE OCORRENCIAS
WHEN NO_DATA_FOUND THEN
VC_DIR_LOG := 'homegemcointegraACSPLog';
VC_DIR_OUT := 'homegemcointegraACSP';
WHEN TOO_MANY_ROWS THEN
VC_DIR_LOG := 'homegemcointegraACSPLog';
VC_DIR_OUT := 'homegemcointegraACSP';
WHEN OTHERS THEN
VC_DIR_LOG := 'homegemcointegraACSPLog';
VC_DIR_OUT := 'homegemcointegraACSP';
END;
-- SETA NOME DO ARQUIVO
VC_ARQ_NOME := 'BACK_TEST_ACSP.txt';
-- INICIA GRAVACAO
ARQ_NRSORTE := UTL_FILE.fopen(VC_DIR_OUT, VC_ARQ_NOME, 'W');
UTL_FILE.fclose(ARQ_NRSORTE);
-- ABRE CURSOR PARA LEITURA E MONTAGEM --
trunctab('CYBELAR_AUX_ACSP');
FOR CUR IN CUR_ACSP LOOP
-- GRAVA O RESULTADO EM UMA TABELA AUXILIAR PARA DEPOIS SER USADA NA EXPORTAÇÃO
-- PARA O SERASA.
/*
INSERT INTO CYBELAR_AUX_SERASA
(SECGCCPF,
SEDTAPRO,
SEPERFOR,
SENRCON,
SEVLRCON,
SEVLRENT,
SEQTPARC,
SEDTNASC,
SESEXOCL,
SERENDA,
SEENDERE,
SECIDADE,
SEESTCIV,
SEESCOLA,
SENRDEPE,
SENATOCU,
SEPROFIS,
SEFONERE)
SELECT SECGCCPF,
SEDTAPRO,
SEPERFOR,
SENRCON,
SEVLRCON,
SEVLRENT,
SEQTPARC,
SEDTNASC,
SESEXOCL,
SERENDA,
SEENDERE,
SECIDADE,
SEESTCIV,
SEESCOLA,
SENRDEPE,
SENATOCU,
SEPROFIS,
SEFONERE
FROM CYBELAR_SERASA
WHERE SECGCCPF = CUR.ACSPCCPF;
COMMIT;*/
VC_LINHA := LPAD(CUR.ACSPCCPF, 11, 0) || ';' ||
LPAD(CUR.ACSPDTAB, 8, 0) || ';' || CUR.ACSPINDP || ';' ||
CUR.ACSPP06M || ';' || CUR.ACSPP18M || ';' ||
LPAD(CUR.ACSPNRO, 2, 0) || ';' || LPAD(CUR.ACSPMDIA, 4, 0) || ';' ||
LPAD(CUR.ACSPDVM, 8, 0) || ';' || LPAD(CUR.ACSPDPM, 8, 0) || ';' ||
LPAD(CUR.ACSPNPM, 2, 0) || ';' || LPAD(CUR.ACSPNROL, 3, 0) || ';' ||
LPAD(CUR.ACSPNRC, 11, 0);
-- GRAVA O REGISTRO NO ARQUIVO
ARQ_NRSORTE := UTL_FILE.fopen(VC_DIR_OUT, VC_ARQ_NOME, 'A');
UTL_FILE.put_line(ARQ_NRSORTE, VC_LINHA);
UTL_FILE.fclose(ARQ_NRSORTE);
END LOOP;
EXCEPTION
WHEN UTL_FILE.INVALID_PATH THEN
dbms_output.put_line('ERRO: INVALID PATH - ' || SQLCODE || ' ' ||
SQLERRM);
WHEN UTL_FILE.INVALID_MODE THEN
dbms_output.put_line('ERRO: FILE ' || VC_DIR_LOG || ' / ' ||
VC_DIR_OUT || ' INVALID MODE - ' || SQLCODE || ' ' ||
SQLERRM);
WHEN UTL_FILE.INVALID_OPERATION THEN
dbms_output.put_line('ERRO: FILE ' || VC_DIR_LOG || ' / ' ||
VC_DIR_OUT || ' INVALID OPERATION - ' || SQLCODE || ' ' ||
SQLERRM);
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
RAISE_APPLICATION_ERROR(-20902, SQLCODE || ' ' || SQLERRM);
WHEN UTL_FILE.INTERNAL_ERROR THEN
dbms_output.put_line('ERRO: INTERNAL ERROR - ' || SQLCODE || ' ' ||
SQLERRM);
WHEN UTL_FILE.READ_ERROR THEN
dbms_output.put_line('ERRO: READ ERROR - ' || SQLCODE || ' ' ||
SQLERRM);
WHEN UTL_FILE.WRITE_ERROR THEN
dbms_output.put_line('ERRO: WRITE ERROR - ' || SQLCODE || ' ' ||
SQLERRM);
WHEN VALUE_ERROR THEN
dbms_output.put_line('ERRO: VALUE ERROR - ' || SQLCODE || ' ' ||
SQLERRM);
WHEN OTHERS THEN
dbms_output.put_line(SQLCODE || ' ' || SQLERRM);
end CYBELAR_EXP_TXT_ACSP;
Creio que o trecho comentado que está ocasionando a demora, pois eliminando ele roda normalmente.