Erro ao importar arquivos via 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
SPECIALIZED
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Ter, 02 Out 2007 4:09 pm
Localização: São Paulo - SP

Pessoal, boa tarde.

Estou com um problema ao importar dois arquivos via utl_file (Header e Lines), porém não encontro nenhuma solução, abaixo está o cenário:

Tenho um arquivo com diversas colunas delimitados por ";", quando recebi os arquivos e finalizei a rotina, fiz diversas importações e correções das informações, só que de uma hora pra outra começou a dar o erro "ORA-29283: Operação de arquivo inválida.", dentro dessas tentativas, tem horas que finaliza e outras não, o problema ocorre exatamente na linha de abertura do arquivo.
O arquivo está no UNIX com privilégio completo 777.
Já criei os arquivos em branco e joguei o conteúdo para dentro, dei todas permissões e não adiantou.

O erro ocorre exatamente na linha em vermelho abaixo:

Selecionar tudo

CREATE OR REPLACE PACKAGE BODY XXPO_DATA_MIGRATION AS
  PROCEDURE HEADER_TMP (I_PATH IN VARCHAR2,
                        I_FILE IN VARCHAR2) AS
  BEGIN
     v_count := 0 ;
     forn_loop := False ;
     v_file_log := utl_file.fopen(trim(I_PATH), trim(I_FILE), 'r', 30000);    ---> ERRO AQUI
     While (Not forn_loop) Loop
        Begin
            .......................
     utl_file.fclose (v_file_log) ;
  END HEADER_TMP ;
alguém já passou por isso e poderia compartilhar a solução ?

Desde já, agradeço
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

Só pode ser 3 coisas:
1. Permissão do Sistema Operacional
2. Diretório errado
3. Oracle não está liberado pra ler no diretório. (parametro UTL_FILE_DIR)
http://glufke.net/oracle/viewtopic.php?t=6073

Confirme os 3 itens!
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Specialized,

Só contribuindo para este tópico, o Tom Kyte (ASKTOM) sugere (http://asktom.oracle.com/pls/apex/f?p=1 ... 5066278457) que é mais fácil a detecção de erros nas rotinas do ULT_FILE se for acrescentado uma rotina de tratamento de erros.

Exemplo:

Selecionar tudo

exception
    when utl_file.invalid_path then
        raise_application_error(-20001,
            'INVALID_PATH: File location or filename was invalid.');
    when utl_file.invalid_mode then
        raise_application_error(-20002,
            'INVALID_MODE: The open_mode parameter in FOPEN was invalid.');
    when utl_file.invalid_filehandle then
        raise_application_error(-20002,
            'INVALID_FILEHANDLE: The file handle was invalid.');
    when utl_file.invalid_operation then
        raise_application_error(-20003,
            'INVALID_OPERATION: The file could not be opened or
        operated on as requested.');
    when utl_file.read_error then
        raise_application_error(-20004,
            'READ_ERROR: An operating system error occurred during
        the read operation.');
    when utl_file.write_error then
        raise_application_error(-20005,
            'WRITE_ERROR: An operating system error occurred during
        the write operation.');
    when utl_file.internal_error then
        raise_application_error(-20006,
            'INTERNAL_ERROR: An unspecified error in PL/SQL.');
end;

Abraços,

Sergio Coutinho
SPECIALIZED
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Ter, 02 Out 2007 4:09 pm
Localização: São Paulo - SP

Sergio, obrigado pelo apoio, já utilizo quase todos esses exceptions, mas vou atribuir os que ficaram de fora e ver se cai em algum deles.

Obrigado pela dica :wink:
Renato Menezes Viana
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Sáb, 18 Nov 2006 11:51 am
Localização: Rio de Janeiro - RJ

Camarada:

Estava com este problema de autorizar diretório, colocar arquivos de outros ambientes e etc...

No final achei melhor pegar uma rotina simples JAVA e processar qualquer arquivo importando para o ORACLE.

Veja abaixo a rotina JAVA bem simples:

Selecionar tudo

import java.io.*;
import java.sql.*;

import javax.swing.JOptionPane;
 


class FileToSQL{

public static void main(String args[]) {
	Connection con = null;
try {
//----- Aqui adaptar pro BANCO DE DADOS ------
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@192.NNN.NNN.NNN:1521:ID_DO_SEU_BANCO","SEU_USUARIO","SUA_SENHA");
Statement stm = con.createStatement();
//----

// aqui preciso dos nomes completos alimentarem esta classe
String arquivo1 = JOptionPane.showInputDialog("Entre com o nome do Arquivo a ser incluido"); \\ path completo partindo da unidade, por exemplo C:\Arquivos para Importar\ArquivoX.csv
BufferedReader reader = new BufferedReader(new FileReader(arquivo1)); 
String dados[] = new String[3]; 
int NRLIN = 0; // number(8) na tabela SQL

// alguma coisa parecida para guardar o nome completo do arquivo para delete e insert
dados[0] = arquivo1; 
stm.executeUpdate("delete NOME_SUA_TABELA where COLUNA_PKEY = '"+dados[0]+"' "); // a coluna pkey aqui é o nome do arquivo 

String linha = null; // reset na linha 



linha = reader.readLine(); // primeiro read da linha


	while (linha != null) { // loop leitura das linhas até o fim
	
// ---- aqui pode fazer todos os tratamentos em cada linha preparando nas colunas da tabela
		
	NRLIN = NRLIN + 1; // é a coluna complemento da PKEY contendo o numero da linha
	
	stm.executeUpdate("insert into NOME_SUA_TABELA (COLUNA_PKEY,NRLIN,DCLIN) values ('"+dados[0]+"','"+NRLIN+"','"+linha+"')"); // inclusões
	
	linha = reader.readLine(); // leitura das demais linhas
	}
	
	con.commit(); // ao fim faz commit
	System.out.println(arquivo1 + " Arquivo importado");
	
}
catch (Exception e) {
	if (con != null) {
		try {
			con.rollback(); // aqui se der qualquer problema faz rollback
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
	}
System.err.println("Erro: " + e.getMessage());
}
}
}
Renato Menezes Viana
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Sáb, 18 Nov 2006 11:51 am
Localização: Rio de Janeiro - RJ

A linha abaixo não apareceu completa no "programinha JAVA", acerta aí:

Selecionar tudo

con = DriverManager.getConnection("jdbc:oracle:thin:@192.NNN.NNN.NNN:1521:ID_DO_SEU_BANCO","SEU_USUARIO","SUA_SENHA");
Renato Menezes Viana
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Sáb, 18 Nov 2006 11:51 am
Localização: Rio de Janeiro - RJ

Caramba, aí vai outra vez em duas linhas:

Selecionar tudo

con = DriverManager.getConnection("jdbc:oracle:thin:@192.NNN.NNN.NNN:1521:ID_DO_SEU_BANCO",
"SEU_USUARIO","SUA_SENHA");
Responder
  • Informação
  • Quem está online

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