Erro ao abrir e ler txt com UTL_FILE

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
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Abro e leio o arquivo assim

Selecionar tudo

V_PATH := FN_UTLFILE('LIQUIDACAO');
V_FILE_HANDLE_R := UTL_FILE.FOPEN (V_PATH, P_NOME_ARQ, 'R');
depois leio assim

Selecionar tudo

UTL_FILE.GET_LINE (V_FILE_HANDLE_R, V_REG); 
e alimento as variáveis dessa forma

Selecionar tudo

V_NR_SEQUENCIA_REGISTRO_H :=  NVL(TO_NUMBER(SUBSTR(V_REG,2,7)),0);
V_DT_PROCESSAMENTO_H         :=  TO_DATE(SUBSTR(V_REG, 9, 10), 'DD/MM/YYYY');
V_NR_SEQUENCIA_ARQUIVO_H  :=  TO_NUMBER(SUBSTR(V_REG, 19, 7));
V_CD_PROGRAMA_H                 :=  SUBSTR(V_REG, 26, 6);
V_CD_EMPRESA_H                    :=  SUBSTR(V_REG, 32, 60);
V_NR_ANO_QUITACAO_H          :=  NVL(TO_NUMBER(SUBSTR(V_REG, 92, 4)),0); 
ao rodar a proc, pego esse erro
Error starting at line : 3 in command -
BEGIN db2user.sp_le_arquivo_carta_quitacao('carta_lea.txt'); END;
Error report -
ORA-29282: invalid file ID
ORA-06512: at "SYS.UTL_FILE", line 735
ORA-06512: at "DB2USER.SP_LE_ARQUIVO_CARTA_QUITACAO", line 107
ORA-06512: at line 1
29282. 00000 - "invalid file ID"
*Cause: A file ID handle was specified for which no corresponding
open file exists.
*Action: Verify that the file ID handle is a value returned from a
call to UTL_FILE.FOPEN.
Que erro é esse?
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Esse erro pensei que fosse do nome do arquivo, que é o ID do UTL_FILE. O SAP cospe esse arquivo que fica num dir dentro do Oracle. Eles estão com o nome em caixa alta, fiz e mesmo assim continua dando o erro. Em algum momento, uma das tres tabelas foi populada e não entendi, limpei a tabela e agora o erro persiste e nada de insert.
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Essa é a proc

Selecionar tudo

 CREATE OR REPLACE PROCEDURE SP_LE_ARQUIVO_CARTA_QUITACAO(
     P_NOME_ARQ IN  VARCHAR2
 )
 AS 
    V_FILE_HANDLE_R    UTL_FILE.FILE_TYPE;
	V_PATH             VARCHAR2(50);
	V_REG              VARCHAR2(800);
	V_NR_GERAL         NUMBER(1);
	
	---------------------------VARIÁVEIS DO HEADER------------------------------
	V_NR_REGISTRO_H                       CARTA_QUITACAO_HEADER.NR_REGISTRO%TYPE;
	V_NR_SEQUENCIA_REGISTRO_H             CARTA_QUITACAO_HEADER.NR_SEQUENCIA_REGISTRO%TYPE;
	V_DT_PROCESSAMENTO_H                  CARTA_QUITACAO_HEADER.DT_PROCESSAMENTO%TYPE;
	V_NR_SEQUENCIA_ARQUIVO_H              CARTA_QUITACAO_HEADER.NR_SEQUENCIA_ARQUIVO%TYPE;
	V_CD_PROGRAMA_H                       CARTA_QUITACAO_HEADER.CD_PROGRAMA%TYPE;
	V_CD_EMPRESA_H                        CARTA_QUITACAO_HEADER.CD_EMPRESA%TYPE;
	V_NR_ANO_QUITACAO_H                   CARTA_QUITACAO_HEADER.NR_ANO_QUITACAO%TYPE;
	V_FL_PROCESSADO_H                     CARTA_QUITACAO_HEADER.FL_PROCESSADO%TYPE;
	
	---------------------------VARIÁVEIS DO DETAIL---------------------------------
	V_ID_CARTA_QUITACAO_HEADER_D          NUMBER(10);
	V_NR_REGISTRO_D                       CARTA_QUITACAO.NR_REGISTRO%TYPE;
    V_NR_SEQUENCIA_REGISTRO_D             CARTA_QUITACAO.NR_SEQUENCIA_REGISTRO%TYPE;
    V_NR_PRODUTO_D                        CARTA_QUITACAO.NR_PRODUTO%TYPE;
    V_NR_CPFCNPJ_D                        CARTA_QUITACAO.NR_CPFCNPJ%TYPE;
    V_TP_CLIENTE_D                        CARTA_QUITACAO.TP_CLIENTE%TYPE;
    V_NR_CONTRATO_D                       CARTA_QUITACAO.NR_CONTRATO%TYPE;
    V_NM_NOME_D                           CARTA_QUITACAO.NM_NOME%TYPE;
    V_NM_RUA_D                            CARTA_QUITACAO.NM_RUA%TYPE;
	V_DS_NUMERO_D                         CARTA_QUITACAO.DS_NUMERO%TYPE;
	V_DS_COMPLEMENTO_D                    CARTA_QUITACAO.DS_COMPLEMENTO%TYPE;   
	V_DS_BAIRRO_D                         CARTA_QUITACAO.DS_BAIRRO%TYPE;
	V_DS_CIDADE_D                         CARTA_QUITACAO.DS_CIDADE%TYPE;
	V_CD_ESTADO_D                         CARTA_QUITACAO.CD_ESTADO%TYPE;
	V_NR_CEP_D                            CARTA_QUITACAO.NR_CEP%TYPE;
	V_NR_DIG_CEP_D                        CARTA_QUITACAO.NR_DIG_CEP%TYPE;
	V_TP_RETOMADO_D                       CARTA_QUITACAO.TP_RETOMADO%TYPE;
	V_NR_GRUPO_D                          CARTA_QUITACAO.NR_GRUPO%TYPE;
	V_NR_QUOTA_D                          CARTA_QUITACAO.NR_QUOTA%TYPE;
	V_NR_SUBST_D                          CARTA_QUITACAO.NR_SUBST%TYPE;
	V_NR_DIGITO_D                         CARTA_QUITACAO.NR_DIGITO%TYPE;
	V_VL_VALOR_D                          CARTA_QUITACAO.VL_VALOR%TYPE;
	
	---------------------------VARIÁVEIS DO TRAILLER------------------------------
	V_ID_CARTA_QUITACAO_HEADER_T          NUMBER(10); 
    V_NR_REGISTRO_T                       CARTA_QUITACAO_TRAILER.NR_REGISTRO%TYPE;
    V_NR_SEQUENCIA_REGISTRO_T             CARTA_QUITACAO_TRAILER.NR_SEQUENCIA_REGISTRO%TYPE;
    V_QT_REGISTRO_T                       CARTA_QUITACAO_TRAILER.QT_REGISTRO%TYPE;
    V_VL_VALOR_T                          CARTA_QUITACAO_TRAILER.VL_VALOR%TYPE;
	
 
 BEGIN
	BEGIN
    
	    V_PATH := FN_UTLFILE('LIQUIDACAO');
        V_FILE_HANDLE_R := UTL_FILE.FOPEN (V_PATH, P_NOME_ARQ, 'R');
        
    EXCEPTION
        WHEN UTL_FILE.INVALID_PATH THEN      
             RAISE_APPLICATION_ERROR(-20001,SQLERRM);  
        WHEN UTL_FILE.INVALID_MODE THEN      
            RAISE_APPLICATION_ERROR(-20003,SQLERRM);
    
    END;
	BEGIN

		LOOP
		    V_NR_REGISTRO_H                := NULL;                 
			V_NR_SEQUENCIA_REGISTRO_H      := NULL;             
			V_DT_PROCESSAMENTO_H           := NULL;          
			V_NR_SEQUENCIA_ARQUIVO_H       := NULL;            
			V_CD_PROGRAMA_H                := NULL;             
			V_CD_EMPRESA_H                 := NULL;             
			V_NR_ANO_QUITACAO_H            := NULL;              
			V_FL_PROCESSADO_H              := 'N';  

		    V_NR_REGISTRO_D                := NULL;
		    V_NR_SEQUENCIA_REGISTRO_D      := NULL;  
		    V_NR_PRODUTO_D                 := NULL;
		    V_NR_CPFCNPJ_D                 := NULL;
		    V_TP_CLIENTE_D                 := NULL;
		    V_NR_CONTRATO_D                := NULL;
		    V_NM_NOME_D                    := NULL;
		    V_NM_RUA_D                     := NULL;
		    V_DS_NUMERO_D                  := NULL;
		    V_DS_COMPLEMENTO_D             := NULL;
		    V_DS_BAIRRO_D                  := NULL;
		    V_DS_CIDADE_D                  := NULL;
		    V_CD_ESTADO_D                  := NULL;
		    V_NR_CEP_D                     := NULL;
		    V_NR_DIG_CEP_D                 := NULL;
		    V_TP_RETOMADO_D                := NULL;
		    V_NR_GRUPO_D                   := NULL;
		    V_NR_QUOTA_D                   := NULL;
		    V_NR_SUBST_D                   := NULL;
		    V_NR_DIGITO_D                  := NULL;
		    V_VL_VALOR_D                   := NULL;	

			V_NR_REGISTRO_T                := NULL;
			V_NR_SEQUENCIA_REGISTRO_T      := NULL;
			V_QT_REGISTRO_T                := NULL;
            V_VL_VALOR_T                   := NULL;
            BEGIN

                UTL_FILE.GET_LINE (V_FILE_HANDLE_R, V_REG); 
				V_NR_GERAL := TO_NUMBER(SUBSTR(V_REG,1,1));
				
				IF V_NR_GERAL = 0 THEN
				    BEGIN
						V_NR_SEQUENCIA_REGISTRO_H :=  NVL(TO_NUMBER(SUBSTR(V_REG,2,7)),0);
						V_DT_PROCESSAMENTO_H      :=  TO_DATE(SUBSTR(V_REG, 9, 10), 'DD/MM/YYYY');
						V_NR_SEQUENCIA_ARQUIVO_H  :=  TO_NUMBER(SUBSTR(V_REG, 19, 7));
						V_CD_PROGRAMA_H           :=  SUBSTR(V_REG, 26, 6);
						V_CD_EMPRESA_H            :=  SUBSTR(V_REG, 32, 60);
						V_NR_ANO_QUITACAO_H       :=  NVL(TO_NUMBER(SUBSTR(V_REG, 92, 4)),0); 
						
						PKG_CARTA_QUITACAO_HEADER.SP_CARTA_QUITACAO_HEADER(
						    V_NR_GERAL,
						    V_NR_SEQUENCIA_REGISTRO_H,
							V_DT_PROCESSAMENTO_H,     
							V_NR_SEQUENCIA_ARQUIVO_H, 
							V_CD_PROGRAMA_H,          
							V_CD_EMPRESA_H,           
							V_NR_ANO_QUITACAO_H,      
							V_FL_PROCESSADO_H
						);
						
						--PKG_CARTA_QUITACAO_HEADER.SP_CARTA_QUITACAO_HEADER_UPDATE;
					END;
				ELSIF V_NR_GERAL = 1 THEN
				    BEGIN
					    SELECT SEQ_CARTA_QUITACAO_HEADER.CURRVAL INTO V_ID_CARTA_QUITACAO_HEADER_D FROM DUAL;
					
					    V_NR_SEQUENCIA_REGISTRO_D      := SUBSTR(V_REG, 2, 7);
						V_NR_PRODUTO_D                 := SUBSTR(V_REG,9, 3);
						V_NR_CPFCNPJ_D                 := NVL(SUBSTR(V_REG, 12, 15),0);
						V_TP_CLIENTE_D                 := SUBSTR(V_REG, 27, 1);
						V_NR_CONTRATO_D                := NVL(SUBSTR(V_REG, 28, 10),0);
						V_NM_NOME_D                    := SUBSTR(V_REG, 38, 60);
						V_NM_RUA_D                     := SUBSTR(V_REG, 98, 60);
						V_DS_NUMERO_D                  := SUBSTR(V_REG, 158, 11);
						V_DS_COMPLEMENTO_D             := SUBSTR(V_REG, 169, 40);
						V_DS_BAIRRO_D                  := SUBSTR(V_REG, 209, 40);
						V_DS_CIDADE_D                  := SUBSTR(V_REG, 249, 40);
						V_CD_ESTADO_D                  := SUBSTR(V_REG, 289, 2);
						V_NR_CEP_D                     := NVL(SUBSTR(V_REG, 291, 5),0);
						V_NR_DIG_CEP_D                 := NVL(SUBSTR(V_REG, 296, 3),0);
						V_TP_RETOMADO_D                := SUBSTR(V_REG, 299, 1);
						V_NR_GRUPO_D                   := NVL(SUBSTR(V_REG, 300, 5),0);
						V_NR_QUOTA_D                   := NVL(SUBSTR(V_REG, 305, 3),0);
						V_NR_SUBST_D                   := NVL(SUBSTR(V_REG, 308, 1),0);
						V_NR_DIGITO_D                  := NVL(SUBSTR(V_REG, 309, 1),0);
						V_VL_VALOR_D                   := NVL(SUBSTR(V_REG, 310, 13),0);
						
						PKG_CARTA_QUITACAO.SP_CARTA_QUITACAO(
						    V_ID_CARTA_QUITACAO_HEADER_D,
							V_NR_GERAL,
							V_NR_SEQUENCIA_REGISTRO_D,
							V_NR_PRODUTO_D,           
							V_NR_CPFCNPJ_D,           
							V_TP_CLIENTE_D,           
							V_NR_CONTRATO_D,          
							V_NM_NOME_D,              
							V_NM_RUA_D,               
							V_DS_NUMERO_D,            
							V_DS_COMPLEMENTO_D,       
							V_DS_BAIRRO_D,            
							V_DS_CIDADE_D,            
							V_CD_ESTADO_D,            
							V_NR_CEP_D,               
							V_NR_DIG_CEP_D,           
							V_TP_RETOMADO_D,          
							V_NR_GRUPO_D,             
							V_NR_QUOTA_D,             
							V_NR_SUBST_D,             
							V_NR_DIGITO_D,            
							V_VL_VALOR_D);
						
					END;
				ELSIF V_NR_GERAL = 9 THEN
				    BEGIN
					    SELECT SEQ_CARTA_QUITACAO_HEADER.CURRVAL INTO V_ID_CARTA_QUITACAO_HEADER_T FROM DUAL;
						
						V_NR_SEQUENCIA_REGISTRO_T   := TO_NUMBER(SUBSTR(V_REG, 2, 7));
						V_QT_REGISTRO_T             := NVL(SUBSTR(V_REG, 9, 7),0);
						V_VL_VALOR_T                := TO_NUMBER(SUBSTR(V_REG, 16, 13));		

                        PCK_CARTA_QUITACAO_TRAILER.SP_CARTA_QUITACAO_TRAILER(
                            V_ID_CARTA_QUITACAO_HEADER_T,
							V_NR_GERAL,
							V_NR_SEQUENCIA_REGISTRO_T,
							V_QT_REGISTRO_T,          
							V_VL_VALOR_T
                        );						
					END;
				
				END IF;
			
			EXCEPTION
			WHEN NO_DATA_FOUND THEN
			    UTL_FILE.FCLOSE(V_FILE_HANDLE_R);
            END;		
		
		END LOOP;
		UTL_FILE.FCLOSE_ALL;
	END;
 
 END;
 /


e essa a chamada da proc

Selecionar tudo

exec sp_le_arquivo_carta_quitacao('carta_cdc.txt')
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Era a falta de um EXIT no NO_DATA_FOUND. Corrigi e o erro sumiu, mas agora é fazer o insert
Responder
  • Informação
  • Quem está online

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