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
carlosmilan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 09 Jun 2008 3:42 pm
Localização: Vargem Grande do Sul - SP
Carlos Milan
Analista de Sistemas

Olá pessoal.

Realizei algumas buscas no forúm e não encontrei nada a respeito (ou procurei mau :( ).
Seguinte, todos exemplos que vejo de leitura de um arquivo sempre se determina o nome dele dentro da procedure. Se eu não souber o nome, pois pode ser xyz.txt ou abc.txt e assim por diante, há alguma forma de pesquisar no diretório? Como faço para ler? Alguém tem alguma sugestão?
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

Brother, beleza ...

Utilizando o UTL_FILE é necessario passar um nome de arquivo.txt (parametro) válido como parametro para que seja realizado a leitura.

Pelo UTL_FILE desconheco outra forma de leitura sem passar um nome valido de arquivo.txt.

porque não tem como saber o nome do arquivo .txt ?????


Abração
carlosmilan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 09 Jun 2008 3:42 pm
Localização: Vargem Grande do Sul - SP
Carlos Milan
Analista de Sistemas

Olá Julian.

Na verdade até tem pois o arquivo tem um certo "padrão".

seria assim ± : I10SG000001.txt
onde: I10SG é padrão, 000001 é o lote (sequencial).

Estava pensando de criar uma sequence e controlar a abertura do arquivo, porém tenho que criar uma estrutura, para verificar até quando passar a sequence para tentar abrir o arquivo.

Você tem idéia de como fazer?
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

Certo ...

Como ele tem um certo padrão e o que diferenciam os arquivos uns dos outros é a numeração final.

Tem algumas maneiras de fazer a leitura do arquivo.

Obs.: Só uma coiisa ainda que nã ficou clara.

" Estava pensando de criar uma sequence e controlar a abertura do arquivo, porém tenho que criar uma estrutura, para verificar até quando passar a sequence para tentar abrir o arquivo. "
1) você tem vários arquivos em seu diretório, todos com as caracteristicas citada acima ... você quer abrir um unico arquivo .txt ???? ou você quer abrir todos os arquivos .txt com as caracteriscas citada acima ?????

2) Se for um unico arquivo ... como você sabe qual deverá ser aberto (pego) ?????

Por favor, dê uma explicação focada nessa parte ... para que a gente possa achar a melhor solução ao problema

Abraço




[/quote]
carlosmilan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 09 Jun 2008 3:42 pm
Localização: Vargem Grande do Sul - SP
Carlos Milan
Analista de Sistemas

Desculpa Julian, realmente não fui claro o bastante.

O caso é seguinte, pode haver mais de um arquivo sim, e seria com aquele número de controle sequencial. Exemplo:

Selecionar tudo

I10SG000001.txt 
I10SG000002.txt 
I10SG000003.txt 
e assim por diante...
carlosmilan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 09 Jun 2008 3:42 pm
Localização: Vargem Grande do Sul - SP
Carlos Milan
Analista de Sistemas

Ops... ia me esquecendo.

Tenho que ler todos os arquivos existentes no diretório, havendo 1 ou 50, tenho de ler todos.
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

beleza Carlos ...

Como você possui +- 50 arquivos e todos deverão ser abertos e lidos, é inviavel você abrir um a um. Conforme sugue abaixo:

Selecionar tudo

  -- Inviavel fazer assim
   arq_1 := UTL_FILE_OPEN(folder , nome_arq , 'R');
   arq_2 := UTL_FILE_OPEN(folder , nome_arq , 'R');
   ...
   arq_n ..

Tem um topico que discute uma situação como a sua:

Obs.: Utilize COLLECTION (PL-TABLE) ... há um otimo exemplo neste link.

http://glufke.net/oracle/viewtopic.php? ... s+arquivos

De uma olhada e qualquer duvida ... mande pra gente

Abração
carlosmilan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 09 Jun 2008 3:42 pm
Localização: Vargem Grande do Sul - SP
Carlos Milan
Analista de Sistemas

Julian.

Valeu mesmo, sua ajuda está sendo muito útil.

Desculpa por não explicar com todos os detalhes desde do inicio, pois para mim tava tudo entendido :oops:
Gostei muito mesmo do fórum e espero aprender muito e contribuir.

Grande abraço.
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

Desculpa por não explicar com todos os detalhes desde do inicio
Esquenta não ... o importante é conseguirmos chegar a soluções.

Qualquer duvida manda pra gente

Abraço
ricardorauber
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 96
Registrado em: Qua, 21 Jun 2006 11:33 pm
Localização: Canoas RS

carlosmilan

Conseguiu fazer o seu procedimento? Caso não tenha conseguido, ai vai a dica:

Eu tive uma vez que fazer um procedimento que lia N arquivos sem saber o nome que vinha então fiz uma solução que usava o Java para executar arquivos .BAT no qual geravam arquivos .TXT com todos os nomes dos arquivos do diretório. Depois disso eu abria esse arquivo .TXT e a cada linha (nome de arquivo) lida, eu abria os arquivos novos.
ricardorauber
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 96
Registrado em: Qua, 21 Jun 2006 11:33 pm
Localização: Canoas RS

Função em Java

Selecionar tudo

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Host" AS
import java.io.*;
public class Host {
  public static void executeCommand(String command) {
    try {
      String[] finalCommand;
      if (isWindows()) {
        finalCommand = new String[4];
        // Use the appropriate path for your windows version.
        finalCommand[0] = "C:\\windows\\system32\\cmd.exe";  // Windows XP/2003
        //finalCommand[0] = "C:\\winnt\\system32\\cmd.exe";  // Windows NT/2000
        finalCommand[1] = "/y";
        finalCommand[2] = "/c";
        finalCommand[3] = command;
      }
      else {
        finalCommand = new String[3];
        finalCommand[0] = "/bin/sh";
        finalCommand[1] = "-c";
        finalCommand[2] = command;
      }
  
      final Process pr = Runtime.getRuntime().exec(finalCommand);
      new Thread(new Runnable(){
        public void run() {
          BufferedReader br_in = null;
          try {
            br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            String buff = null;
            while ((buff = br_in.readLine()) != null) {
              System.out.println("Process out :" + buff);
              try {Thread.sleep(100); } catch(Exception e) {}
            }
            br_in.close();
          }
          catch (IOException ioe) {
            System.out.println("Exception caught printing process output.");
            ioe.printStackTrace();
          }
          finally {
            try {
              br_in.close();
            } catch (Exception ex) {}
          }
        }
      }).start();
  
      new Thread(new Runnable(){
        public void run() {
          BufferedReader br_err = null;
          try {
            br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
            String buff = null;
            while ((buff = br_err.readLine()) != null) {
              System.out.println("Process err :" + buff);
              try {Thread.sleep(100); } catch(Exception e) {}
            }
            br_err.close();
          }
          catch (IOException ioe) {
            System.out.println("Exception caught printing process error.");
            ioe.printStackTrace();
          }
          finally {
            try {
              br_err.close();
            } catch (Exception ex) {}
          }
        }
      }).start();
    }
    catch (Exception ex) {
      System.out.println(ex.getLocalizedMessage());
    }
  }
  
  public static boolean isWindows() {
    if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1)
      return true;
    else
      return false;
  }

};
/
PL/SQL

Selecionar tudo

CREATE OR REPLACE PROCEDURE Host_Command (p_command  IN  VARCHAR2)
AS LANGUAGE JAVA 
NAME 'Host.executeCommand (java.lang.String)';
/
Grants necessários

Selecionar tudo

EXEC DBMS_JAVA.grant_permission('SCHEMA-NAME', 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');
EXEC Dbms_Java.Grant_Permission('SCHEMA-NAME', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('SCHEMA-NAME', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
Utilização

Selecionar tudo

SET SERVEROUTPUT ON SIZE 1000000
CALL DBMS_JAVA.SET_OUTPUT(1000000);
BEGIN
  Host_Command (p_command => 'DIR c:\*.xls /a /b -> c:\arqs.txt');
END;
ricardorauber
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 96
Registrado em: Qua, 21 Jun 2006 11:33 pm
Localização: Canoas RS

É bem chatinho de conseguir executar a primeira vez, até porque o java tem que estar devidamente configurado no servidor, mas depois que executa a primeira, da pra pegar qualquer classe java e executar no oracle!
carlosmilan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 09 Jun 2008 3:42 pm
Localização: Vargem Grande do Sul - SP
Carlos Milan
Analista de Sistemas

Já tinha implementado da forma que o Julian tinha sugerido.

Vou implementar utilizando JAVA e comparar qual é mais eficaz...


Muito obrigado.
Responder
  • Informação
  • Quem está online

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