Carga de Dados via Arquivo txt com PL/SQL

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
leolima_pinheiro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 03 Jul 2008 9:04 am
Localização: Barueri

:D Bom dia a Todos,

Estou iniciando agora no mundo Oracle, através de um estágio que tive oportunidade de conhecer toda esta tecnologia.

Faz alguns dias que estou estudando persistentemente PL/SQL e a semana que vem terei o meu primeiro desafio para ser cumprido, que é o seguinte:

Tenho um arquivo txt que precisa ser carregado para 10 tabelas diferentes no banco de Dados Oracle, sendo que o commit só poderá ser realizado se não ocorrer nenhum erro durante a carga de dados, sendo que se o mesmo acontecer será necessário um rollback, gerando um log de erro que contenha exatamente o momento que o erro aconteceu, para que se tenha um controle do que está e como está sendo inserido nessas tabelas.

Bom, este é o problema que tenho pra resolver durante a semana que vem, é claro que terei uma pessoa mais experiente me auxiliando mais gostaria de já ter uma base por onde começo, para a solução do problema. Me disseram que teria que ser feito via PL/SQL porém não tenho certeza se isso é possivel, por isso venho ao fórum pedir qualquer tipo de ajuda para solução deste problema.

Qualquer tipo de ajuda é válida, já deixo meus agradecimentos a todos que puderem me ajudar.
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

O esquema é usar a package UTL_FILE para ler o arquivo texto...
Depois você só vai precisar montar a sua lógica para ler o arquivo e popular as tabelas (conforme a regra de negócio).
E se você tratar TODOS os blocos separadamente, então será tranquilo aplicar ROLLBACK e então gravar em uma tabela de log o exato momento que o erro ocorrer.
Pesquise sobre como usar a package UTL_FILE...

Bom, eu faria desta forma... hehe

T+
leolima_pinheiro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 03 Jul 2008 9:04 am
Localização: Barueri

Bom muito obrigado João Garcia
Realmente foi a maneira escolhida para resolver a questão, porém surgiu um outro problema, o txt que será lido pela package UTL_FILE, terão os campos das tabelas separados por ' ; ' e até agora só fiz isso delimitando as posições que os campos estão distribuidos no txt, será que você conseguiria me ajudar a a leitura do arquivo com o separador com a UTL_FILE ??

OBRIGADO !!!!
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Opa, beleza ai...
Olha o exemplo abaixo.
É bem simples e dá pra você entender como será o tratamento do separador na leitura da linha.
Estou considerando que você já sabe como usar a package UTL_FILE para ler o arquivo.

T+

Selecionar tudo

DECLARE
  vLinha    VARCHAR2(100);
  vCampo    VARCHAR2(200);
BEGIN
  --
  vLinha := 'CODIGO;NOME;FONE;EMAIL;ENDERECO;ESTADO;';
  --
  FOR vPosicao IN 1.. LENGTH(vLinha) LOOP
    --
    IF SUBSTR(vLinha,vPosicao,1) <> ';' THEN
      vCampo := vCampo || SUBSTR(vLinha,vPosicao,1);
    ELSE
      DBMS_OUTPUT.put_line( vCampo );
      vCampo := NULL;
    END IF;
    --
  END LOOP;
  --
END;
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

caraaa mata o UTL_FILE para ler arquivos delimitados por ";"
usa External Table... pra mim fica tudo mais simples....
você vai fazer o seu script apenas com selects(olha qui maravilha)
você pode criar uma external table para ler o arquivo e monta um script para ler esta tabela e ir inserindo nas outras...

e para fazer o log usa o melhor comando do mundo

abre o SQL*Plus e digita

Selecionar tudo

 spool c:\log_de_inserção_que_mandaram_eu_fazer_em_algum_lugar_usando_external_table_dia_04_de_junho_de_2008.txt
e manda braza do script =D

eu postei mais ou menos como faiz isso aqui http://glufke.net/oracle/viewtopic.php?t=3297

mais procura on forum qui tem mais coisas....

BS
rafaelchagas.sp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 13 Out 2009 4:52 pm
Localização: Sorocaba - SP

esse spool funciona em procedure?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

sim
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

Acho que não.
SPOOL é um comando do SQL*Plus, não do PLSQL.

Ele funciona dentro de um script do Sql*plus, dai sim.
Responder
  • Informação
  • Quem está online

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