Copiar Arquivos gerados UTL_FILE para local

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

Pessoal, após usar o Diretorio do Oracle, na realidade, ele contêm /opc/... ou outro local qualquer no SERVIDOR consegui via UTL_FILE.Put e Open e Close gerar um arquivo.txt.
Como conseguir copiar este arquivo.txt para um diretório local do meu notebook?
Via PL/SQL ou qualquer artificio via PL/SQL Developer da Allround Automation.
Deus lhes pague.
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

Se você quer fazer isso apenas uma vez, sugiro usar um FileZilla e conectar direto no IP do servidor.

Caso você não tenha acesso a esse servidor, eu acho que dá pra fazer algum tipo de gambiarra:
* Ler esse arquivo pra dentro de um campo BLOB
* No PLSQL developer, fazer um SELECT * nessa tabela e baixar o arquivo do campo blob pra sua máquina.

Aqui tem um exemplo:
https://community.oracle.com/tech/devel ... blob-table

Selecionar tudo

DECLARE
  l_bfile BFILE;
  l_blob BLOB;

  l_dest_offset INTEGER := 1;
  l_src_offset INTEGER := 1;

  l_your_dir_name varchar2(50):= v('P1_DIR_NAME');
  l_your_file_name varchar2(100):= v('P1_FILE_NAME');

BEGIN
  select blob_content into l_blob from stool.yomama for update;

  l_bfile := BFILENAME(l_your_dir_name, l_your_file_name);

  dbms_lob.open(l_blob, dbms_lob.lob_readwrite);

  DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);

  -- loadfromfile deprecated.
  -- DBMS_LOB.loadfromfile(l_blob, l_bfile, DBMS_LOB.getlength(l_bfile));
  DBMS_LOB.loadblobfromfile (
  dest_lob => l_blob,
  src_bfile => l_bfile,
  amount => DBMS_LOB.lobmaxsize,
  dest_offset => l_dest_offset,
  src_offset => l_src_offset);

  dbms_lob.close(l_blob);
  DBMS_LOB.fileclose(l_bfile);
  COMMIT;
END;
/

Explica melhor o que você precisa fazer que a gente tenta ajudar.
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

Thomas,

Perfeito, foi mais ou menos essa a solução.
Criei uma tabela com uma única coluna varchar2(2000), porque meu arquivo.txt era até menor, e usando as mesmas formas UTL_FILE agora pra ler esse .TXT e fazer um INSERT...com values (linha.txt).
Commit no fim do .TXT e depois nas ferramentas do Developer exportar como um Excel e aí no Excel fazer aquela de TXT pra colunas.
Obrigado pelo auxílio.
Abs
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

Thomas,

Você falou em Filezilla, mas a única coisa que sei é que existe um Diretório Oracle onde observando as propriedades consigo ver /opt/loader/dat onde consigo operar com as bibliotecas UTL_FILE.
Apenas com essa informação acredito não consiga fazer o Filezilla.
Como conseguir este IP?
O Developer pede aqueles dados na tela de Oracle Logon (username, password,database, além da forma de connect: Normal, SYSDBA e SYSOPER, nunca usei além de Normal).
A forma de INSERT resolve a maioria das necessidades, mas como a tabela onde ocorre o INSERT não possui uma chave ordenadora, o primeiro registro no arquivo TXT, o cabeçalho, não necessariamente fica como primeira linha na tabela.
Tem como definir algum critério no Create da tabela pra INSERT para obedecer a mesma ordem dos registros do arquivo TXT?
Abs
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

Thomas,

Seguindo pela gambiarra, leio o primeiro registro do arquivo TXT e faço o primeiro INSERT e faço commit.
Depois continuo fazendo a leitura dos demais registros do arquivo TXT e seus inserts.
Aí no fim do arquivo TXT faço commit.
Funciona.
Abs
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

Thomas,

Funciona NADA!
Após o primeiro commit, parei o debug e listei e claro só tinha o primeiro registro na tabela com rowid ....AADr6nAAA

Mandei continuar com commit só ao final e o maldito cabeçalho continuava a ser em um select * o "registro 89" da tabela com o mesmo rowid, mas acima dele os outros 88 registros da tabela começando o primeiro com rowid ...AADr6jAAA sendo o 88 rowid ...AADr6mAAV

Posso fazer commit a cada INSERT e mesmo assim continua o cabeçalho aparecendo como o 89.

Falta de conhecimento é uma mer**
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

Então:
Pra acessar com o Filezilla tem que ter um usuário e senha no sistema operacional do servidor Oracle. (Caso você consiga conectar no servidor via SSH, basta usar o mesmo Host/Porta e Usuário/Senha.).
O problema é que as vezes a gente não tem um usuário no server. Por isso eu sugeri salvar o arquivo numa tabela.
O IP está no arquivo TNSNAMES.ora. Mas isso é o de menos. Tem que ter um usuário do LINUX. (Não um usuário de banco)

Pra manter a ordem correta, sugiro criar uma SEQUENCE.
Daí quando você insere na tabela, usa essa sequence.

Imagino que sua tabela seja:

Selecionar tudo

ORDEM number;
TEXTO  varchar2(2000);
Daí você cria uma sequence e insere:

Selecionar tudo

INSERT INTO suatabela
VALUES
( nomeDaSequence.NEXTVAL
, v_texto   -- Esse texto é o que você recuperou com UTL_FILE.
);
Assim você mantém a ordem PERFEITA no campo ORDEM.
Se não é isso, explica melhor o problema do ROWID.
(Lembre-se ROWID ****NUNCA**** deve ser usado como campo ordenador).
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

Thomas,

Beleza então, a solução pra INSERT na mesma ordem do arquivo TXT é usar uma coluna ordenadora sequence.
Obrigado
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

Thomas,

Uma grande gambiarra consegui evitar o sequence.
Logo após fazer o INSERT do cabeçalho, faço commit e select rowid, linha into vrowid0, vlinha0 from tabela_linha;
Prossigo normalmente fazendo INSERT para as demais linhas.
Ao final da leitura do arquivo TXT faço commit.
Tenho um cursor cur_arq select rowid, Lin.* From tabela_linha Lin;

Com o cursor consigo a certeza de trazer a primeira linha da tabela_linha;

Selecionar tudo

v_seq := 0;
For z in cur_arq loop
  Begin
    If v_seq = 0 then
      vrowidn := z.rowid;
      vlinhan := z.linha;
    end If;
    v_seq := v_seq + 1;
  End;
end loop;

Update tabela_linha
Set linha = vlinha0
Where rowid = vrowidn;

Update tabela_linha
Set linha = vlinhan
Where rowid = vrowid0;

Commit;
Funcionou beleza
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

Thomas,

Sabe mente de programador não para de revisar o código, então não precisa da v_seq, no loop basta guardar vrowidn e vlinhan e dar EXIT saindo do loop.

Depois por segurança somente fazer os dois UPDATEs se wrowid0 diferente wrowidn, afinal nunca se sabe as possibilidades.

Abs
Responder
  • Informação
  • Quem está online

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