Otimização de cursores

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Dom, 08 Set 2019 11:32 am

Estou com o seguinte problema fiz alguns cursores para exportar algumas informações para texto, porém está demorando mais de 2 horas para exportar 4 mil linhas, o problema aconteceu

depois de ter incluído os registros de nível 3 e 4 algumas dessas tabelas estão sem informação não sei se seria esse o problema, todas as minhas tabelas estão indexadas.

Gostaria de saber se alguém pode me ajudar a otimizar esse tempo ou me informar qual seria a melhor maneira de fazer isso, sem o nível 3 e 4 levava 5 min para gerar o mesmo resultado, agora leva mais de 2hs. Abaixo Segue o Cursor. Obrigado!



---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Código: Selecionar todos
SET SERVEROUTPUT ON;
DECLARE
  MEU_ARQUIVO UTL_FILE.FILE_TYPE;
 
    CURSOR CR_0000 IS SELECT * FROM TBL_EFD_ICMS_0000;     
    CURSOR CR_C100 IS SELECT * FROM TBL_EFD_ICMS_C100;
    CURSOR CR_C110 IS SELECT * FROM TBL_EFD_ICMS_C110;
    CURSOR CR_C111 IS SELECT * FROM TBL_EFD_ICMS_C111;
   
    REG_0000 CR_0000%ROWTYPE;
    REG_C100 CR_C100%ROWTYPE;
    REG_C110 CR_C110%ROWTYPE;
    REG_C111 CR_C111%ROWTYPE;

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BEGIN
    MEU_ARQUIVO := UTL_FILE.FOPEN('DIRETORIO', 'SAIDAS_NEW.txt', 'w');
       
    OPEN CR_0000; -- nivel 1
        LOOP
            FETCH CR_0000 INTO REG_0000;
            EXIT WHEN CR_0000%NOTFOUND;
            UTL_FILE.PUT_LINE(MEU_ARQUIVO,'|'||REG_0000.REG
            ||'|'||REG_0000.COD_VER
            ||'|'||REG_0000.DT_INI
            ||'|'||REG_0000.DT_FIN
            ||'|'||REG_0000.CNPJ
            ||'|'||REG_0000.IND_ATIV ||'|');
           
            OPEN CR_C100; -- nivel 2
                LOOP
                    FETCH CR_C100 INTO REG_C100;
                    EXIT WHEN CR_C100%NOTFOUND;
                    IF  REG_C100.ID_0000 = REG_0000.ID_0000 THEN
                        UTL_FILE.PUT_LINE(MEU_ARQUIVO,'|'||REG_C100.REG
                        ||'|'||REG_C100.SER
                        ||'|'||REG_C100.NUM_DOC
                        ||'|'||REG_C100.CHV_NFE
                        ||'|'||REG_C100.DT_DOC
                        ||'|'||REG_C100.DT_E_S
                        ||'|'||REG_C100.VL_DOC
                        ||'|'||REG_C100.VL_COFINS_ST ||'|');
                    END IF;
                   
                    OPEN CR_C110; -- nivel 3
                        LOOP
                            FETCH CR_C110 INTO REG_C110;
                            EXIT WHEN CR_C110%NOTFOUND;
                            IF  REG_C110.ID_0000 = REG_0000.ID_0000 AND
                                REG_C110.ID_C100 = REG_C100.ID_C100 THEN
                                UTL_FILE.PUT_LINE(MEU_ARQUIVO,'|'||REG_C110.REG
                                ||'|'||REG_C110.COD_INF
                                ||'|'||REG_C110.TXT_COMPL ||'|');
                            END IF;
                   
                            OPEN CR_C111; -- nivel 4
                                LOOP
                                    FETCH CR_C111 INTO REG_C111;
                                    EXIT WHEN CR_C111%NOTFOUND;
                                    IF  REG_C111.ID_0000 = REG_0000.ID_0000 AND
                                        REG_C111.ID_C100 = REG_C100.ID_C100 AND
                                        REG_C111.ID_C110 = REG_C110.ID_C110 THEN
                                        UTL_FILE.PUT_LINE(MEU_ARQUIVO,'|'||REG_C111.REG
                                        ||'|'||REG_C111.COD_INF
                                        ||'|'||REG_C111.TXT_COMPL ||'|');
                                    END IF;
                                END LOOP;
                            CLOSE CR_C111;
                           
                        END LOOP;
                    CLOSE CR_C110;
                   
                END LOOP;
            CLOSE CR_C100;
           
        END LOOP;
    CLOSE CR_0000;

DBMS_OUTPUT.PUT_LINE('Arquivo gerado com sucesso.');

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Exception
WHEN UTL_FILE.INVALID_OPERATION THEN
Dbms_Output.Put_Line('Operação inválida no arquivo.');
UTL_FILE.FCLOSE(MEU_ARQUIVO);
WHEN UTL_FILE.WRITE_ERROR THEN
Dbms_Output.Put_Line('Erro de gravação no arquivo.');
UTL_FILE.FCLOSE(MEU_ARQUIVO);
WHEN UTL_FILE.INVALID_PATH THEN
Dbms_Output.Put_Line('Diretório inválido.');
UTL_FILE.FCLOSE(MEU_ARQUIVO);
WHEN Others THEN
Dbms_Output.Put_Line('Problemas na gravação do arquivo.');
UTL_FILE.FCLOSE(MEU_ARQUIVO);
END;
/
alextds

Mensagemem Seg, 09 Set 2019 4:08 pm

Tam como você postar aqui o resultado dessa query?

Código: Selecionar todos
select table_name, num_rows
from all_tables
where table_name in ('TBL_EFD_ICMS_0000'
                    ,'TBL_EFD_ICMS_C100'
                    ,'TBL_EFD_ICMS_C110'
                    ,'TBL_EFD_ICMS_C111');
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered



Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Google [Bot] e 14 visitantes