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;
/