Ler arquivo texto e gravar

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
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Fiz uma rotina que abre um arquivo texto com FOPEN e jogo em uma variável. Pego essa var, leio e vou quebrando o arquivo com SUBSTR(var, pos_ini, pos_fim) e grava no BD com os devido ajustes. Isso dentro de uma proc. O meu líder me pediu, para fazer uma proc para ler o arquivo texto e depois a proc de insert pegar esses valores e inserir. Estou na dúvida em como fazer isso. Não estou pedindo código, mas como fazer, uma caminho, um norte, tipo uma proc chamando outra e etc. Atualmente a proc não tem parâmetro, mas acho que vou alterar. Como são 3 situações, que vou inserir, sendo assim. HEADER, DETAIL e TRAILLER. Logo serão duas procs em cada package, já que é uma Package para cada tipo(Header, Detail e Trailler).
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

Sugestão:
Criar apenas uma package pra isso e colocar todas procedures dentro dessa única package.
Dessa forma tudo relacionado a essa carga fica agrupado dentro dessa package.

Pelo que eu entendi, ele quer que seja feito algo assim:

PACKAGE ABC
PROC1
- LOOP para ler cada linha do arquivo.
- - Se tipo for header, chama PRC_HEADER( linha );
- - Se tipo for detail, chama PRC_DETAIL ( linha );
- - Se tipo for trailer, chama PRC_TRAILLER( linha );
- END LOOP

PROC_HEADER
- Pega a linha e separa cada campo em variáveis.
- Insere o registro.

PROC_DETAIL
- Pega a linha e separa cada campo em variáveis.
- Insere o registro.

PROC_TRAILLER
- Pega a linha e separa cada campo em variáveis.
- Insere o registro.
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Eu fiz mais ou menos isso. A dúvida tofda está em pegar a FK do Header, por que? Porque eu gravo 4 arquivos, FIN, LEA, CDC e CON. Essas são apenas as terminações, porém eu não gravo o nome dos arquivos na tabela em momento algum. Estou prguntando se os arquivos são sobtreescrito, aí fica mais fácil.
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

Mas não basta passar via parâmetro a FK do header?

PACKAGE ABC
PROC1
- LOOP para ler cada linha do arquivo.
- - Se tipo for header, chama FNC_HEADER( linha ) RETURN NUMBER;
- - Se tipo for detail, chama PRC_DETAIL ( fk, linha );
- - Se tipo for trailer, chama PRC_TRAILLER( fk, linha );
- END LOOP

FNC_HEADER ( pFK, pLINHA )
- Pega a linha e separa cada campo em variáveis.
- Insere o registro.
- RETURN o número da FK ou PK criada.

PROC_DETAIL ( pFK, pLINHA )
- Pega a linha e separa cada campo em variáveis.
- Insere o registro.

PROC_TRAILLER ( pFK, pLINHA )
- Pega a linha e separa cada campo em variáveis.
- Insere o registro.
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Me desculpe, mas não entendi essa sua lógica em como passar a FK do header para as procs. Max() não é conveniente fazer. Me desculpe, mas não compreendi.
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Posso pegar o valor da sequence da tabela? É válidop e elegante isso?
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, tem muitas formas de se fazer isso.

Digamos que você tem um LOOP pra ler cada linha do seu arquivo.
Daí a primeira linha é do tipo HEADER.
O programa lê a linha inteira e salva numa váriável.
Daí logo depois, ele verifica que a primeira linha é HEADER, e chama a FNC_HEADER.

FNC_HEADER( variável_com_a_linha ).
Dentro desse programa, ele gera um CODIGO pra inserir esse header.
(Digamos que você tenha uma SEQUENCE que controla o número do header a ser inserido.)
Aí, separa cada campo pra dentro da sua respectiva variável.
E faz o INSERT no banco.
Aí RETORNA o valor do ID gerado. (afinal, isso é uma FUNCTION, e não uma procedure. Por isso eu chamei de FNC_HEADER)

Com isso, o programa vai de volta pra onde estava antes.
Vai processar a linha numero 2.
Digamos que essa linha é um DETAIL.
Neste momento, você passa 2 parâmetros pra PRC_DETAIL ( numero_do_id_header, var_com_a_linha_inteira );
Daí a PRC_DETAIL sabe que tem fazer o LINK usando o "numbero_do_id_header".

Eu não sei se é isso que você quer fazer.
É meio difícil de dar uma idéia, porque tem 200 maneiras de diferentes de fazer isso. Depende do que você quer fazer.

Outra maneira é antes de chamar a procedure do HEADER, você gerar a sequence com o ID DO HEADER, e salvar ela numa variável.
E daí passar esse ID pra todas procedures.
Responder
  • Informação
  • Quem está online

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