Ajuda com leitura de arquivo e procedure (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
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Olá Pessoal !! meu 1º tópico aqui, e já lhes apresento uma dúvida, hehehe

Seguinte, preciso ler um arquivo que tem delimitadores e tem o seguinte layout:

arquivo de preços(vou colocar apenas algumas linhas do arquivo):

Selecionar tudo

1INT063754^CHIPSET INTEL IHDFI^UM^INTEL CORPORATION
201JAN2003000000012530
Onde, na 1º linha, tenho, na ordem, separado pelo delimitador "^", o código do produto, o nome do produto, unidade e fornecedor. aquele número "1"(antes do "INT06.....") nesta primeira linha, significa os atributos do produto, nas quais já descrevi acima.

A 2º linha que está o problema maior. o número "2" no começo dessa linha significa que nela estará descrita o preço e a data que este preço foi estipulado.
A 1º linha eu estou conseguindo ler, graças a ajuda da função elemento, que o Gori postou aqui uma vez. A dúvida reside na 2º linha.
preciso ler a data (01JAN2003) e o preço (00000012530). A única certeza que tenho é que preciso usar o UTL_FILE. Mas, ler a data e preço é a minha dúvida.

Alguém pode me ajudar e, se possível mostrar um trecho de código que faça isso?

Muito obrigado !
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Só pra clarear mais (referente à 2º linha do arquivo de preços):

a data começa na posição 2 e tem tamanho = 9, ou seja, preciso ler da posição 2 até a 9, para pegar a data (01JAN2003).

o preço começa na posição 11 e tem tamanho = 12, ou seja, preciso ler da posição 11 até a 22 para pegar o preço (00000012530)

Obrigado.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Bom, seguinte...

Provavelmente você tem um layout, com posições determinando cada tipo de informação.

Na leitura do teu LOOP, você pode verificar as posições referentes ao Layout, e extrair conforme a necessidade do mesmo.

Veja esse exemplo com SUBSTR, que talvez ajude:

Selecionar tudo

SELECT SUBSTR('201JAN2003000000012530',2,9)  data,
       SUBSTR('201JAN2003000000012530',11,12) valor
  FROM dual ;
qualquer coisa, manda ai.
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

você está certo, Trevisolli, porém, o meu arquivo é muito maior que isso (tem várias linhas com preços e datas, assim como essa que eu coloquei no tópico).
Todas as datas do meu arquivo começam na posição 2 e tem tamanho = 9 e o preços, todos eles começam na posição 11 e tem tamanho = 12.

Como eu poderia transformar essa solução via substrings que tu me passou, em uma solução genérica, que sirva para todas as outras datas e preços?

Muito obrigado, mais uma vez.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Bom, uma idéia, seria criar uma função ou procedure para tratar esse teu arquivo que deve ser carregado.

Nesta função ou procedure, você validaria todo o teu layout.

Daí, no carregamento do arquivo, você passa essa função/procedure para cada linha que está sendo lida...

Abaixo, coloquei um exemplo, de como poderia ser uma parte da tua função/procedure que irá validar a linha corrente...

Uma idéia apenas para que você faça para os demais campos do teu layout.

Exemplo:

Selecionar tudo

DECLARE 
  V_preço NUMBER(10,2);
  V_LINHA_CRITICA VARCHAR2(1000);
BEGIN     
   -- Validando preço... (supondo que no trecho do preço, veio um caracter)
   BEGIN 
      SELECT TO_NUMBER('A')
        INTO V_preço
        FROM dual;
   EXCEPTION      
   WHEN OTHERS THEN      
     V_LINHA_CRITICA := 'Preço contém caracteres não numéricos.';
     dbms_output.put_line('V_LOG_ERROS: ' || V_LINHA_CRITICA);
   END;  
   -- validando data
   -- Monte aqui um trecho como no begin/end do preço, para validar a data, por exemplo...
END;
Qualquer coisa, manda ai.
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 SQL*Loader consegue tratar esse tipo de arquivo "multi-estrutura"... Talvez seja uma boa você dar uma lida a respeito disso.
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Muito obrigado, pessoal !!

Com a luz que vocês me deram, estou conseguindo resolver melhor o problema. :D
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Precisando, conta com a gente.
;)
Responder
  • Informação