[RESOLVIDO]Inserir valores de um xml no banco oracle

25 respostas
Viniciustelles

Boa tarde, preciso inserir os registros de um xml no banco oracle, lendo o xml ja estou conseguindo minha grande duvida mesmo é como inseri-los na base de dados.
Alguém tem um exemplo ou ideia abs.

25 Respostas

A

Há algumas opções par aisso:

Viniciustelles

Obrigado pela dica mas minha duvida atual, é como criar o stateman do java para inserir.

E

Acho que ele tem um XML bem bobo, como este:

<clientes>
     <cliente>
          <nome>Fulano de Tal</nome>
          <endereco>Rua dos Tolos numero 1</endereco>
      </cliente>
     <cliente>
          <nome>Sicrano de Tal</nome>
          <endereco>Palacio do Crepusculo numero 7</endereco>
      </cliente>
     <cliente>
          <nome>Beltrano de Tal</nome>
          <endereco>Rua da Amargura numero 13</endereco>
      </cliente>
</clientes>

e ele quer inserir 3 registros em uma tabela contendo os campos “nome” e “endereco”.

Se for isso, basta decompor o XML e inserir os registros “manualmente” (ou seja, via programa).

Viniciustelles

Pena meu amigo meu arquivo xml é muito grande nao posso carrega-lo para dar uma olhada, ele é maior que isso tem cerca de 800 registros

nel

entanglement:
Acho que ele tem um XML bem bobo, como este:

<clientes>
     <cliente>
          <nome>Fulano de Tal</nome>
          <endereco>Rua dos Tolos numero 1</endereco>
      </cliente>
     <cliente>
          <nome>Sicrano de Tal</nome>
          <endereco>Palacio do Crepusculo numero 7</endereco>
      </cliente>
     <cliente>
          <nome>Beltrano de Tal</nome>
          <endereco>Rua da Amargura numero 13</endereco>
      </cliente>
</clientes>

e ele quer inserir 3 registros em uma tabela contendo os campos “nome” e “endereco”.

Se for isso, basta decompor o XML e inserir os registros “manualmente” (ou seja, via programa).

E o xStream ou JAXB dão uma ajuda muito boa nesse quesito.

nel

Não pode carregar ele aqui no fórum ou via programa, você se refere ?
Já adianto que se diz que não dá via programa, quero saber o motivo. Ele pode ter 800 registros e não chegar a ter 1 MB de tamanho, o que é processo “fácil” ao Java, se for bem implementado, obviamente.

Viniciustelles

O xStream tem uma ferramenta que auxilia na inserção no banco?

Viniciustelles

Não consigo carrega-lo aqui no forum :frowning:

nel

Você ao menos clicou no link, Vinicius ? É uma API para se trabalhar com XML, leitura e escrita, basicamente, mas a nível de objeto e não arquivo físico (ele faz isso por baixo dos panos).

E afinal, tu quer desenvolver um software que dado um XML, você extrai determinados valores e os insere em um banco de dados ou quer simplesmente uma ferramenta que faça algo desse tipo ?

Viniciustelles

Ai que ta, to desenvolvendo um software que lê o xml e salva no banco, na minha aplicação consigo ler xml facilmente o problema ta em inseri-los no banco

nel

Se ele já lê facilmente o XML, o que falta para inserir no banco ? Olha o que o entanglement disse, é aquilo de lá mesmo. Entenda, quando diz que seu software lê o XML eu entendo que ele consegue extrair o valor de dentro de uma tag XML, por exemplo.

E

Vinícius. Você realmente sabe carregar o tal do XML mesmo?

Por exemplo, você consegue ir listando os registros que você carregou do XML e separar os campos (nem que seja para mostrá-los com um System.out.println ou um JOptionPane.showMessageDialog?

No caso do seu XML, você poderia pelo menos mostrar um dos registros desse XML?

Se conseguir listar o registro, é muito fácil inserir os dados no banco.

Viniciustelles

Sim consigo extrair os valores das tags…

E

Não; mas você pode usar qualquer outra coisa para pegar os campos dos objetos que o XStream gera para você para poder inserir no banco.

E

Se consegue, agora é só dar uma procuradinha por “JDBC”. Você sabe escrever uma query SQL INSERT ? É algo muito simples.

Viniciustelles

consigo lista-los no system.out.println mas não estou obtendo sucesso na inserção da base de dados

Este é meu método que insere

public void insereDados(Cabecalho cabecalho, IdentificacaoTransacao identificacaoTransacao,
            CodigoPrestadorNaOperadora codigoPrestadorNaOperadora, Destino destino, LoteGuias loteGuias,
            IdentificacaoFontePagadora identificacaoFontePagadora, IdentificacaoGuiaSADTSP identificacaoGuiaSADTSP,
            DadosBeneficiario dadosBeneficiario, Contratado contratado, ConselhoProfissional conselhoProfissional, PrestadorExecutante prestadorExecutante,
            ProfissionalExecutanteCompl profissionalExecutanteCompl, GuiaSP_SADT guiaSP_SADT, CID cid, ValorTotal valorTotal) {

        Connection con = criaConexao();
        PreparedStatement ps = null;
        String query = "INSERT INTO carga_xml (TIPOTRANSACAO,SEQUENCIALTRANSACAO,DATAREGISTROTRANSACAO,HORAREGISTROTRANSACAO,CODIGOPRESTADORCNPJ,"
                + "CNPJPAGADOR,VERSAOPADRAO,NUMEROLOTE,CNPJFONTEPAGADORA,DATAEMISSAOGUIA,NUMEROGUIAPRESTADOR,NUMEROGUIAOPERADORA,NUMEROCARTEIRA,"
                + "NOMEBENEFICIARIO,NOMEPLANO,VALIDADECARTEIRA,CONTRATADOCPF,NOMECONTRATADO,NUMEROCONSELHO,UFCONSELHO,PRESTADOREXECUTANTECNPJ"
                + "NOMECONTRATADOEXECUTANTE,NOMEEXECUTANTECOMPL,SIGLACONSELHOCOMPL,NUMEROCONSELHOCOMPL,UFCONSELHOCOMPL,CARATERATENDIMENTO,DATAHORAATENDIMENTO"
                + "NOMETABELA,CODIGODIAGNOSTICO,TIPOSAIDA,TIPOATENDIMENTO,TOTALSERVICOSEXECUTADOS,TOTALTAXAS,TOTALMATERIAIS,TOTALMEDICAMENTOS,TOTALTOTALGERAL)"
                + "VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? );";

        try {
            ps = con.prepareCall(query);
            ps.setString(1, identificacaoTransacao.getTipoTransacao());
            ps.setString(2, identificacaoTransacao.getSequencialTransacao());
            ps.setString(3, identificacaoTransacao.getDataRegistroTransacao());
            ps.setString(4, identificacaoTransacao.getHoraRegistroTransacao());
            ps.setString(5, codigoPrestadorNaOperadora.getCNPJ());
            ps.setString(6, destino.getCnpjPagador());
            ps.setString(7, cabecalho.getVersaoPadrao());
            ps.setString(8, loteGuias.getNumeroLote());
            ps.setString(9, identificacaoFontePagadora.getCnpjFontePagadora());
            ps.setString(10, identificacaoGuiaSADTSP.getDataEmissaoGuia());
            ps.setString(11, identificacaoGuiaSADTSP.getNumeroGuiaPrestador());
            ps.setString(12, identificacaoGuiaSADTSP.getNumeroGuiaOperadora());
            ps.setString(13, dadosBeneficiario.getNumeroCarteira());
            ps.setString(14, dadosBeneficiario.getNomeBeneficiario());
            ps.setString(15, dadosBeneficiario.getNomePlano());
            ps.setString(16, dadosBeneficiario.getValidadeCarteira());
            ps.setString(17, contratado.getIdentificacao().getCpf());
            ps.setString(18, contratado.getNomeContratado());
            ps.setString(19, conselhoProfissional.getSiglaConselho());
            ps.setString(20, conselhoProfissional.getNumeroConselho());
            ps.setString(21, conselhoProfissional.getUfConselho());
            ps.setString(22, prestadorExecutante.getIdentificacao().getCNPJ());
            ps.setString(23, prestadorExecutante.getNomeContratado());
            ps.setString(24, profissionalExecutanteCompl.getNomeExecutante());
            ps.setString(25, profissionalExecutanteCompl.getConselhoProfissional().getSiglaConselho());
            ps.setString(26, profissionalExecutanteCompl.getConselhoProfissional().getNumeroConselho());
            ps.setString(27, profissionalExecutanteCompl.getConselhoProfissional().getUfConselho());
            ps.setString(28, guiaSP_SADT.getCaraterAtendimento());
            ps.setString(29, guiaSP_SADT.getDataHoraAtendimento());
            ps.setString(30, cid.getNomeTabela());
            ps.setString(31, cid.getCodigoDiagnostico());
            ps.setString(32, guiaSP_SADT.getTipoSaida());
            ps.setString(33, guiaSP_SADT.getTipoAtendimento());
            ps.setString(34, valorTotal.getServicosExecutados());
            ps.setString(35, valorTotal.getTaxas());
            ps.setString(36, valorTotal.getMateriais());
            ps.setString(37, valorTotal.getMedicamentos());
            ps.setString(38, valorTotal.getTotalGeral());
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
            } catch (Exception e) {
            }
            try {
                con.close();
            } catch (Exception e) {
            }

        }
E

TODOS os campos da tabela são VARCHAR?

Acredito que não todos (nunca vi uma tabela com tantos campos em que todos os campos são VARCHAR).

Em vez de usar setString para todo mundo (isso se chama “programação por macaquice” - você copia o código de alguém sem entender o que está acontecendo), cheque quais são os tipos adequados, e use o método adequado (veja os métodos em http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html ).

nel

rsrs…fui obrigado a rir.

Viniciustelles se não está conseguindo inserir, tem de nos informar o motivo, também. É exceção ? Não insere e não mostra erro algum ? Esse tipo de informação é essencial para ajuda-lo.

Viniciustelles

Vou olhar o material, mas criei todos os campos como VARCHAR2 mesmo isso é assim mesmo

E

Outra coisinha que vai pegar depois.

A menos que você esteja usando um “connection pool”, você está abrindo e fechando a conexão a cada vez que você faz um insert. Se você disse que tem 800 registros, isso vai ser algo bem devagar para executar.

E

Qual é a exceção impressa? Pelo que vimos, você imprime a exceção

Viniciustelles

Como você me aconselha a fazer para não ficar lento

Viniciustelles

run: Banco conectado com sucesso! Exception in thread "main" java.lang.NullPointerException at br.com.businessflex.model.DadosXML.insereDados(DadosXML.java:97) at br.com.businessflex.model.ReadXML.main(ReadXML.java:19) Java Result: 1 CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

nel

Viniciustelles:
run: Banco conectado com sucesso! Exception in thread "main" java.lang.NullPointerException at br.com.businessflex.model.DadosXML.insereDados(DadosXML.java:97) at br.com.businessflex.model.ReadXML.main(ReadXML.java:19) Java Result: 1 CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

Curiosidade, porque uma classe em português (DadosXML) e outra em inglês (ReadXML) ? É ideal padronizar.
O erro indica que alguma referência nula está tentando executar alguma ação, algo como:

String s = null; s.trim();

Verifiquei a linha 97 da sua classe DadosXML, deve ter algo do tipo.

E

Não sei onde é a linha 97 do seu código, mas sempre tem cheirinho de coisas parecidas com esta:

profissionalExecutanteCompl.getConselhoProfissional().getSiglaConselho()

Se o profissional executante, por algum motivo, não tiver um conselho profissional, deve retornar null, e você chamar getSiglaConselho em cima de null vai gerar um NullPointerException.

Sempre tome cuidado com chamadas encadeadas de funções, você pode ter esse tipo de problemas.

Criado 8 de junho de 2012
Ultima resposta 8 de jun. de 2012
Respostas 25
Participantes 4