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
Responder
alextds
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qua, 05 Dez 2018 8:47 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!



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

Selecionar tudo

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;
/
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

Tam como você postar aqui o resultado dessa query?

Selecionar tudo

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');
alextds
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qua, 05 Dez 2018 8:47 am

não há resultado fica em um loop que não tem retorno não sei porque,

o resultado geralmente vem dessa forma

|0000|01012018|31012018|cnpj|
|0001|151515|099090|0|
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

OK, as essa query abaixo retorna a quantidade de linhas de cada tabela...
É o que eu quero saber.

Selecionar tudo

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');
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes