Ler Arq Externo sem UTL_FILE Via Oracle Developer ou PL/SQL da Allround

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

Prezados, essa do UTL_FILE pra acessar arquivos externos, ou seja, aqueles convencionais .txt ou mesmo .csv todo mundo já sabe.
Agora todos também sabem que aqueles Directories do Oracle definimos onde esses arquivos residem com os path, por exemplo, /arquivos/txt

Cacete, será o IMPOSSÍVEL, nem o Oracle Developer nem o PL/SQL Developer da Allround não tem um "explorer" destes Directories?

Cacilda, eles nunca imaginaram que seria muito útil, por exemplo, usar um "explorer" para selecionar um arquivo e fazer download ou cópia para um diretório qualquer da REDE ou da própria máquina (SEU NOTEBOOK) que se encontra conectada ao BANCO ORACLE?

Por*** quer dizer POXA VIDA! Temos que fazer uma procedure usando a po*** do UTL_FILE pra acessar estes "convencionais"?
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

O que você quer dizer com "um "explorer" destes Directories?"
Pra acessar esses diretórios basta ter o user/senha do servidor. (Quem não tem, não pode acessar).

Já tentou criar um External Table pra facilitar ?

Selecionar tudo

SQL> CREATE TABLE EVENTS_XT_1
  2  (EVENT       varchar2(30),
  3   START_DATE  date,
  4   LENGTH      number)
  5  ORGANIZATION EXTERNAL
  6  (default directory def_dir1 location ('events_all.csv'));

Table created.

SQL> select START_DATE, EVENT, LENGTH
  2    from EVENTS_XT_1
  3    order by START_DATE;

START_DAT EVENT                              LENGTH
--------- ------------------------------ ----------
18-MAR-09 Hockey Tournament                       3
28-APR-09 Baseball Expo                           2
02-MAY-09 International Football Meeting         14
28-SEP-09 Rugby Kickoff                           6
10-JAN-10 Winter Games                           10
12-MAY-10 Track and Field Finale                  3
05-JUL-10 Mid-summer Swim Meet                    4

7 rows selected.

SQL> 

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

Dr.Gori
DIRECTORY_NAME LOADER_DAT_DIR
DIRECTORY_PATH D:\LOADER_DAT_DIR
Privilege list READ, WRITE

Claro que como meu DB foi instalado no meu Notebook eu posso criar um Directory onde o PATH está em dos meus discos locais D:\LOADER_DAT_DIR
Aí posso listar tudo que existe via "explorer Windows", copiar, editar qualquer arquivo CONVENCIONAL.
Pergunto, eu com pleno acesso a um BD remoto (estou conectado via uma VPN) e tendo acesso a toda forma e maneira deste BD poderei então criar um DIrectory com um PATH apontando um diretório da rede dito acesso público ou quem sabe a um diretório deste meu Notebook que está conectado ao BD remoto via uma VPN?
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

Deixa eu ver se entendi:
* Você tem acesso ao um servidor ORACLE via VPN.
* Você quer acessar o conteúdo dos directories do Oracle. (Estes directories são pastas no servidor).

Se é isso que você quer, então vai precisar ter um usuário no sistema operacional com acesso a essa pasta.
Você até pode mapear essa pasta no seu notebook, mas isso não tem nada a ver com o Oracle, e sim com o sistema operacional. (Alguém vai ter que liberar essa pasta em algum tipo de compartilhamento).

Acho que você está dando a culpa pro Oracle pra uma coisa que é do Sistema Operacional.
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,
Só entenda que na grande maioria das vezes esses directories são mantidos como o LOCAL DE ONDE UM FTP VAI LER UM ARQUIVO E VAI TRANSMITI-LO PARA UM FTP DESTINO.
Sabe como é esse pessoal de PRODUÇÃO cheio de cuidados, até com razão, mas naquela da SUSTENTAÇÃO até estar presente na "procedure" que gerou o arquivo convencional ("TXT") em um dos malditos directories Oracle (onde existe o PATH \x\y\z) e aí os cuidados "não deixam" que possamos "tocar mais nestes preciosos".
Vou deixar a solução que adotei pra sair desta enrrascada.

Selecionar tudo

CREATE OR REPLACE PROCEDURE UTL_FILE_IN_DIRECTORY_TO_TABLE (P_DATA_BASE VARCHAR2)
IS

-- OPÇÃO CRIAR PRIMARY KEY MAIS SIMPLES PRA GARANTIR A MESMA ORDEM DA GERAÇÃO
-- AO ACESSAR PARA TRANSFERIR PRA MAQUINA LOCAL:
-- BASTA SELECT LINHA FROM USERX.TMP_TABLE_LINHA_TXT ORDER BY SEQUENCIA;
  v_SEQUENCIA NUMBER(18) := 0;

  V_DATA_COBRANCA_HOJE    DATE;
  V_DATA_COBRANCA_PASSOU  DATE;
  V_DATA_COBRANCA_ARQUIVO VARCHAR2(8);
  V_NOME_ARQUIVO          VARCHAR2(25) := 'NOMEARQTXT_';
  V_NOME_ARQUIVO_COBRANCA VARCHAR2(37);
  V_DATA_EMISSAO_DOC      DATE;

  V_Arquivo_Saida UTL_File.File_Type;
  V_Dir_Arq       VARCHAR2(60);
 
  LIN_TODA VARCHAR2(4000);

  ----------------------------
      
  BEGIN
  
    IF P_DATA_BASE IS NOT NULL THEN
      -- Se for informar data o parâmetro é string dd/mm/yyyy (evita qualquer problema NLS)
      V_DATA_COBRANCA_HOJE := to_date(P_DATA_BASE,'dd/mm/yyyy');
    ELSE
      V_DATA_COBRANCA_HOJE := trunc(sysdate);
    END IF;
  
    V_DATA_COBRANCA_PASSOU  := V_DATA_COBRANCA_HOJE;
    
    V_DATA_COBRANCA_ARQUIVO := to_char(V_DATA_COBRANCA_PASSOU, 'YYYYMMDD');
  
    --Directories Oracle onde está o arquivo "TXT" pra leitura (PATH \x\y\z)
    V_Dir_Arq := 'DIR_ARQ_ENV';
    -- Montando o NOME do arquivo para leitura
    V_NOME_ARQUIVO_COBRANCA := V_NOME_ARQUIVO || V_DATA_COBRANCA_ARQUIVO ||
  
    --- Abrindo o arquivo para leitura de consistencia
  
    V_Arquivo_saida := UTL_File.Fopen(V_Dir_Arq,
                                      V_NOME_ARQUIVO_COBRANCA,
                                      'R',
                                      4000);
                    
--  EXECUTE IMMEDIATE 'TRUNCATE TABLE USERX.TMP_TABLE_LINHA_TXT';
--  create table USERX.TMP_TABLE_LINHA_TXT (sequencia numeric(18), linha varchar2(4000), CONSTRAINT CHAVE PRIMARY KEY (sequencia));

    DELETE FROM USERX.TMP_TABLE_LINHA_TXT;

    COMMIT;
 
 LOOP
      BEGIN
        
        v_sequencia := v_sequencia + 1;
        UTL_File.Get_Line(V_Arquivo_Saida, LIN_TODA);
        INSERT INTO USERX.TMP_TABLE_LINHA_TXT values (v_sequencia,LIN_TODA);
        
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
        
        EXIT;
        
      END;
    
 END LOOP;
  
    COMMIT;
  
     --- FECHAMENTO FINAL DO ARQUIVO
  
    UTL_File.Fclose(V_Arquivo_saida);
--  Dbms_Output.Put_Line('Arquivo ' & V_NOME_ARQUIVO_COBRANCA & ' ' & v_sequencia & ' registros lidos com sucesso.');
  
    /* ----- ROWID ESTRUTURA
    
    select rowid, 
           dbms_rowid.rowid_relative_fno(rowid) as rel_fno,
           dbms_rowid.rowid_row_number(rowid) as row_num,
           dbms_rowid.rowid_block_number(rowid) as block_num, 
           dbms_rowid.rowid_object(rowid)
    from SMV_RLT_APOLICE_CANC_NOTE 
    order by rowid;
    
    */ ----------------------
  
    --- Dbms_Output.Put_Line('Arquivo lido com sucesso.'); -- APENAS PRA DEPURACAO
  
    /* --- APENAS PARA DEPURACAO
    
      Exception
    
        WHEN UTL_FILE.INVALID_OPERATION THEN
          Dbms_Output.Put_Line('Operação inválida no arquivo.');
          UTL_File.Fclose(V_arquivo_saida);
        WHEN UTL_FILE.WRITE_ERROR THEN
          Dbms_Output.Put_Line('Erro de gravação no arquivo.');
          UTL_File.Fclose(V_arquivo_saida);
        WHEN UTL_FILE.INVALID_PATH THEN
          Dbms_Output.Put_Line('Diretório inválido.');
          UTL_File.Fclose(V_arquivo_saida);
        WHEN Others THEN
          Dbms_Output.Put_Line('Problemas na gravação do arquivo.');
          UTL_File.Fclose(V_arquivo_saida);
    
    */ -----------------------------------------
  

End UTL_FILE_IN_DIRECTORY_TO_TABLE;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Bing [Bot], Google [Bot] e 20 visitantes