Ir para o conteúdo

Publicidade

 Estatísticas do Fórum

  • 0 Usuários ativos

    0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

Cursos Online iMasters
Foto:

[PL/SQL] Como acessar arquivos com PL?

  • Por favor, faça o login para responder
6 respostas neste tópico

#1 Paulo Faria

Paulo Faria
  • Membros
  • 2 posts

Postado 18 julho 2006 - 11:49

Caros amigos,

como posso ler arquivos textos pelo PL/SQL e carregá-los para uma tabela?

ex:

Tabela: TB_DESC
Formato da tabela:
CO_DESC varchar2(3)
DS_DESC varchar2(3)

Arquivo: c:\teste.txt
Dados:
001|abc
002|def
003|ghi

Se puderem ajudar ficarei grato!
  • 0

#2 Motta

Motta

    Motta

  • Moderadores
  • 8.693 posts

Postado 18 julho 2006 - 14:28

Utilize a packge Sys.Utl_file

exemplo :

DECLARE
  aArquivo	SYS.UTL_FILE.FILE_TYPE;
  sLinhaArq   varchar2(4000);

BEGIN
  aArquivo := Sys.Utl_file.Fopen(sCaminho,'...NOME ARQUIVO...','r');
  While Not (bFim) Loop
	Begin
	  SYS.UTL_FILE.Get_Line(aArquivo,sLinhaArq);
	  -- processo ....
   Exception
	  When no_data_found then
		bFim := True;
	  When Others then
		Raise;
	End;
  End loop;
  SYS.UTL_FILE.FCLOSE(aArquivo);
END;

  • 0

#3 Paulo Faria

Paulo Faria
  • Membros
  • 2 posts

Postado 19 julho 2006 - 08:38

Motta,

fiz algo parecido com isso, o que estava me retornando um erro.

declare
 v_arquivo utl_file.file_type;
 v_linha varchar2(1000);
begin
 v_arquivo := utl_file.fopen('/home/oracle', 'teste.txt', 'r');
 loop begin
  utl_file.get_line(v_arquivo, v_linha);
  dbms_output.put_line(v_linha);
  exception
  when no_data_found then
   utl_file.fclose(v_arquivo);
   exit;
  end;
 end loop;
end;

Retornava o seguinte erro:
ERRO na linha 1:
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 33
ORA-06512: at "SYS.UTL_FILE", line 436
ORA-06512: at line 5

O problema estava no caminho para o arquivo. Consegui resolver o problema criando um objeto DIRECTORY e posteriormente passando este objeto.

create or replace directory DOC_PATH as '/home/oracle'

declare
 v_arquivo utl_file.file_type;
 v_linha varchar2(1000);
begin
 v_arquivo := utl_file.fopen('DOC_PATH', 'teste.txt', 'r');
 loop begin
  utl_file.get_line(v_arquivo, v_linha);
  dbms_output.put_line(v_linha);
  exception
  when no_data_found then
   utl_file.fclose(v_arquivo);
   exit;
  end;
 end loop;
end;

  • 0

#4 MonTiLLa

MonTiLLa
  • Membros
  • 236 posts

Postado 19 julho 2006 - 10:22

Paulo,

Sera que nesta linha
v_arquivo := utl_file.fopen('/home/oracle', 'teste.txt', 'r');

nao precise modificar para
v_arquivo := utl_file.fopen('/home/oracle/', 'teste.txt', 'r');

:thumbsup:
  • 0

#5 Motta

Motta

    Motta

  • Moderadores
  • 8.693 posts

Postado 19 julho 2006 - 12:45

O caminho do utl também deve ser definido, isto não conheço pois aqui que criou foi o dba.
  • 0

#6 MonTiLLa

MonTiLLa
  • Membros
  • 236 posts

Postado 19 julho 2006 - 13:53

Cara,

Faz o seguinte entao...

você tem que habilitar o parametro para o pacote UTL_FILE funcionar, roda o comando abaixo e reinicia o seu banco de dados:

alter system set utl_file_dir='c:\','d:\','*' scope=spfile


Neste comando você esta dando permissao do pacote usar qualquer pasta do sistema, podendo alterar por pastas especificas tb como no exemplo abaixo:

alter system set utl_file_dir='c:\' scope=spfile

:joia:
  • 0

#7 alphamek

alphamek

    www.rodrigoalmeida.net

  • Membros
  • 1.925 posts

Postado 24 julho 2006 - 00:47

Isso mesmo Montilla,

Antes de utilizar o UTL_FILE, veja o parametro UTL_FILE_DIR da sua instâcia o local que ele aponta e veja se tem todas as permissões.

Caso esteja com *, você poderá gerar os arquivos em qualquer lugar, desde que tenha permissão.

Abraços, :lol:
  • 0




Publicidade

/ins>