Ler arquivo texto e gravar
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).
- dr_gori
- Moderador
- Mensagens: 5013
- 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
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.
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.
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.
- dr_gori
- Moderador
- Mensagens: 5013
- 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
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.
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.
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.
Posso pegar o valor da sequence da tabela? É válidop e elegante isso?
- dr_gori
- Moderador
- Mensagens: 5013
- 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
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.
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.
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 50 visitantes