Ler um arquivo CSV via codigo PLSQL

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
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, boa tarde...

Amigos, mais uma vez estou precisando de ajuda, preciso ler um determinado arquivo .CSV... ler e salvar em tabela

Achei um post na net, estou tentando ajustar ele na minha aplicação, como teste, estou utilizando os nomes das colunas igual ao exemplo, para facilitar... porem não esta dando certo, fala q o caminho do arquivo não é encontrado...

veja o código

Selecionar tudo

DECLARE
      F UTL_FILE.FILE_TYPE;
      V_LINE VARCHAR2 (1000);
      V_EMPNO NUMBER(4);
      V_ENAME VARCHAR2(10);
      V_SAL NUMBER(7,2);
      V_DNAME VARCHAR2(14);
    BEGIN
      F := UTL_FILE.FOPEN ('D:\', 'LIC_TESTE.CSV', 'R');
    IF UTL_FILE.IS_OPEN(F) THEN
      LOOP
        BEGIN
          UTL_FILE.GET_LINE(F, V_LINE, 1000);
          IF V_LINE IS NULL THEN
            EXIT;
          END IF;
          V_EMPNO := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 1);
          V_ENAME := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 2);
          V_SAL := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 3);
          V_DNAME := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 4);
          INSERT INTO LIC_TESTE VALUES(V_EMPNO, V_ENAME, V_SAL, V_DNAME);
          COMMIT;
        EXCEPTION
        WHEN NO_DATA_FOUND THEN
          EXIT;
        END;
      END LOOP;
   END IF;
  UTL_FILE.FCLOSE(F);
 END; 
Eu criei a tabela no meu banco chamada LIC_TESTE... criei uma planilha chamada LIC_TESTE

Os nomes dos campos e das colunas, são iguais ao do exemplo

Coloquei a planilha na raiz do drive "D"

já fiz varias tentativas com o NOME do caminho, porém, nenhum dá certo

Estou utilizando o APEX ORACLE 19
Criei um botão, com uma ação dinâmica, na ação EXECUTAR CÓDIGO PL/SQL

Poderiam me ajudar a fazer esse código funcionar? agradeço
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

Esse arquivo está no servidor Oracle?
UTL_FILE roda dentro do servidor Oracle.

Aqui tem um exemplo pra criar um DATA LOADER no Apex.
https://jeffkemponoracle.com/2018/11/lo ... into-apex/
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola,

Não, ele ta externo, no micro mesmo... vou dar uma olhada novamente nesse DATA LOADER, mas tentei alguns exemplos, mas não consegui fazer funcionar com o DATA LOADER
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

carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, bom dia

Acho que por falta de conhecimento ainda, no APEX já existe algo prático, eu utilizei o "Assistente de Carregador de Dados APEX", dai ajustei a tela certinha com os campos, funcionou perfeitamente... o usuário que irá fazer a carga dos dados, então desta forma, cada um faz o seu carregamento ne

Utilizei a dica do DR.GORI, pesquisando nesse link

https://jeffkemponoracle.com/2018/11/lo ... into-apex/

Muito obrigado pela dica e ajuda...
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

ola,

Aproveitando o post... nesse mesmo sentido do "Assistente de Carregador de Dados APEX", só que para fazer o inverso, tem alguma ferramenta no APEX que carrega um arquivo .CSV com os dados de uma tabela?

Faz isso sem precisar criar função com códigos, pegar algo como o assistente
??
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

To sem Apex aqui, mas pelo que eu sei, existe isso nativamente.
Acho que você pode definir que uma tabela é "Exportável".

Acho que nesse link tem o que você precisa:
https://docs.oracle.com/en/database/ora ... kshop.html
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola,

Sim, existe isso nativo, porém para EXPORTAR eu so achei em modo de desenvolvimento, um usuário final da aplicação não teria o acesso ao WORKSHOP... no assistente para importar dados, foi criado paginas, onde o usuario pode navegar para realizar a importação... pensei em algo parecido com a IMPORTAÇÃO, onde o usuário acessaria uma pagina para gerar o CSV
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

Pelo que eu sei, todos reports em APEX tem uma opção pra fazer download.
Não é isso que você está procurando ? Veja:

Como configurar a opção de Download
https://docs.oracle.com/cd/E23903_01/do ... HTMDB25361
https://docs.oracle.com/cd/E23903_01/do ... m#BABFIECH
Screen Shot 2019-04-25 at 10.05.41 AM.png
Screen Shot 2019-04-25 at 10.06.01 AM.png
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, sim eu vi essa opcao e fiz alguns testes... porém ainda não consegui baixar um arquivo, com base numa consulta, que criasse um arquivo CSV formatado....

É o seguinte, no inicio do post eu procurava uma opção de IMPORTAR dados de um arquivo CSV ne, pois é, esse arquivo a ser importado será o mesmo que o usuario irá gerar antes...

Num processo licitatório, pregão, o proponente pega o EDITAL e nós damos uma planilha excel para que ele coloque seus preços iniciais para os itens a serem licitados, essa planilha já tem que ir numa formatação padrão para que no dia da licitação o pregoeiro pegue essa planilha e importe os dados

Por isso eu tenho que gerar ela num padrão correto, pois eu vou utilizar essa mesma la no dia da licitacao...

O problema é o seguinte, se fosse eu que fizesse esse download no excel, com facilidade eu formataria as colunas, deixava certinho para q la na frente eu utilizasse ela para importar os dados novamente, depois que o proponente colocasse os seus valores por itens... acontece que tenho que considerar que o usuario final, e isso é real, não tem conhecimento para mexer com excel, muito menos formatar no padrão que o sistema precisa...

Por isso eu tenho que garantiar que a planilha seja gerada correta, para que a importacao ocorra no dia da licitacao sem erros

Mas vou dar mais uma fuçada nesse download, tentar configurar melhor
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 CSV não tem formatação especial.
CSV é um arquivo TEXTO delimitado por algum sinal: , ; ou outro.

O que você quer dizer com arquivo formatado?
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Seguinte, quando eu faço o download d um CSV, ele vem com o nome das colunas, igual ao nome dos campos do banco de dados.. ele já pega a primeira do csv pro titulo e a partir da segunda linha, já vem os dados...

Porém, quando eu falo em algo formatado, é porq eu eu preciso jogar em outras celulas determinadas, outros valores, alem da lista d itens, tipo:

NUMERO DA LICITACAO
ANO DA LICITACAO
CODIGO DO PROPONENTE
CNPJ DO PROPONENTE

Eu preciso ter esses dados para q, no momento que o proponente me devolver essa planilha, na hora da importação, eu preciso identificar para qual licitacao e para qual proponente eu vou importar os itens...

Eu já faço isso no sistema em VISUAL BASIC, fero a planilha com os itens, com as devidas identificacoes extras, quando vou importar, essas dados extras eu faço a identificacao

Então, a formatação, não exatamente enfeitar TITULOS das colunas, a formatação é no momento que for gerar a planilha, ter a opçao de inserir outros dados, alem da grid do apex q é exibida para download
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Acredito que nessa opcao de download não vou conseguir gerar esse CSV, da forma que preciso, vai ter q ser via codigo mesmo, dai poderei ter opção de determinar celulas com dados extras
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Na verdade, da forma que eu utilizo atualmente no sistema em VISUAL BASIC, eu tenho um arquivo "PROPOSTA_BASE.XLS", via codigo, eu não crio uma planilha nova, eu preencho esse arquivo base... dai automaticamente os dados de identificacao já vao pra cada celula especifica, e a partir de tal linha, começa a relação de itens, veja o modelo q uso na imagem

Como eu tenho um modelo a ser preenchido automaticamente, posso dar um acabamento melhor, porém, a questão do acabamento não é o principal, o principal é a identificação no retorno, e garantir que as colunas não seja excluidas, etc... manter a padrão
Anexos
tela gerar XLS.jpg
Responder
  • Informação
  • Quem está online

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