Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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;
/'
>
27 minutos atrás, Motta disse:
Os cursores tem uma hierarquia ?
Os sqls 100,110 e 111 não deveriam ter uma condição where ?
Sim os cursores tem uma hierarquia, as condições estão nos IF's estão vinculados pelos índices "id" dos pais
ex:
ID_0000 para o nível 1 bisavo,
ID_0000 , ID_C100 para o nível 2 avo,
ID_0000 , ID_C100 , ID_C110 para o nivel 3 pai
ID_0000 , ID_C100 , ID_C110 para o filho
Poderia ser um cursor só com joins , for em cascata ou cursor com parâmetros
Veja se ajuda :
http://estacaozn.blogspot.com/2009/05/cursor-com-parametros-em-plsql.html?m=1
>
7 minutos atrás, Motta disse:
Poderia ser um cursor só com joins , for em cascata ou cursor com parâmetros
Veja se ajuda :
http://estacaozn.blogspot.com/2009/05/cursor-com-parametros-em-plsql.html?m=1
Dei uma olhada más como isso pode me ajudar?
Amanhã se tiver tempo melhoro a resposta.
Estou no tablet , ruim de editar códigos.
>
Em 08/09/2019 at 15:59, Motta disse:
Poderia ser um cursor só com joins , for em cascata ou cursor com parâmetros
Veja se ajuda :
http://estacaozn.blogspot.com/2009/05/cursor-com-parametros-em-plsql.html?m=1
Dei uma olhada más como isso pode me ajudar?
Nossa ninguém ajuda em nada mais nesses fóruns, e quando respondem só fazem mais perguntas gerando mais dúvidas, só perda de tempo mesmo.
Eu pessoalmente ando sem tempo , mas foruns tem isto mesmo.
Basicamente seus curdores estão lendo tudo e o filtro fica num filtro fora dele , um parametro e jm filtro no WHERE pode resolver.
As vezes temos de perguntar pois faltam dados ba pergunta para um reposta.
Os cursores tem uma hierarquia ?
Os sqls 100,110 e 111 não deveriam ter uma condição where ?