Pular para o conteúdo

Fóruns Banco de dados Oracle Dados Aleatórios Dados Aleatórios

#91971
facc
Participante

    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.