Ler aquivo .txt e gravar no banco de dados.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Trancado
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Pessoal alguém tem um script ou uma procedure que lê arquivo .txt no diretório de grava no banco de dados?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Retirei de um post aqui do forum,

Para funcionar você tem que ter o parametro UTL_FILE_DIR setado,
veja como esta com

Selecionar tudo

select value from v$parameter where name like '%utl%';
precisa criar um directory no banco e dar permissoes de leitura para o usuiario que vai rodar o script,

Selecionar tudo

declare
  vLinha    Varchar2(2000);
  uArquivo  Utl_File.File_Type;
Begin
  --------------------------
  -- Define no do Arquivo --
  --------------------------
  Begin
    -----------------------
    --- Abre arquivo txt --
    -----------------------
    uArquivo := Utl_File.FOpen(P_Nome_Local , P_Nome_Arq  , 'r');
    ---------------------------------
    -- Loop para Ler o Arquivo Txt --
    ---------------------------------
    Loop
      Begin
        Utl_File.Get_Line(uArquivo , vLinha);
        Insert Into Tabela
             ( Coluna01 -- 01
             , Coluna02 -- 02
             )
        Values
             ( Substr( vLinha , 1,20 )
             , Substr( vLinha ,21,20 )
             );
      Exception
        -- reached the end of file
        When No_Data_Found      Then
          Exit;
        -- line to long to store in buffer
        When Value_Error        Then
          Raise_Application_Error(-20214, 'Value_Error '||sqlerrm);
        -- not a valid file handle
        When Utl_File.Invalid_FileHandle Then
          Raise_Application_Error(-20215, 'Invalid_filehandle '||sqlerrm);
        -- file is not open for reading
        When Utl_File.Invalid_Operation  Then
          Raise_Application_Error(-20216, 'invalid_operation '||sqlerrm);
        -- OS error occurred during read
        When Utl_File.Read_Error         Then
          Raise_Application_Error(-20217, 'Read_Error '||sqlerrm);
      End;
    End Loop;
    Utl_File.FClose(uArquivo); 
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Brother.
os parametros P_Nome_Local e P_Nome_Arq eles tem que estar fixo no código, certo?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

pode ser algo do tipo

Selecionar tudo

P_Nome_Local VARCHAR2(1024) := '/u01/oracle/admin/SID/udump'; 
ou então você pode definir como parametro de entrada da sua procedure e quando chamara passar somente o valor
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

e o nome do arquivo?...ele muda a cada mês. essa leitura é mensal e vem com a data do dia.

ex:

Selecionar tudo

arq_bb_30_10_09
arq_bb_30_11_09

como faço?
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

aqui nesse comando:

Selecionar tudo

Utl_File.Get_Line(uArquivo , vLinha); 
os parametros uArquivo e vLinha recebe o que? de onde?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

uArquivo é o arquivo que você abriu em modo R (read),

o vLinha é cada volta do Loop pegando a linha atual do arquivo, o que você deve tratar, o conteudo do arquivo propriamente dito,

Selecionar tudo

nome do arquivo := 'arq_bb'||to_char(sua_data, 'dd')||'_'||to_char(sua_data, 'mm')||'_'||to_char(sua_data, 'rr');
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

O topico foi trancado por que o dono do mesmo já criou outro.

http://glufke.net/oracle/viewtopic.php?t=5460
Trancado
  • Informação