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.
[RESOLVIDO]Inserir valores de um xml no banco oracle
25 Respostas
Há algumas opções par aisso:
-
Se teu XML tiver menos que 4kb, você pode usar um tipo VARCHAR2 normalmente
-
Utilizar um campo do tipo CLOB.
-
O oracle tem um tipo específico para XML (pode facilitar se precisar fazer queries pelo conteúdo do xml)
http://docs.oracle.com/cd/B10500_01/appdev.920/a96620/xdb04cre.htm
Obrigado pela dica mas minha duvida atual, é como criar o stateman do java para inserir.
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).
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
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).
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.
O xStream tem uma ferramenta que auxilia na inserção no banco?
Não consigo carrega-lo aqui no forum 
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 ?
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
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.
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.
Sim consigo extrair os valores das tags…
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.
Se consegue, agora é só dar uma procuradinha por “JDBC”. Você sabe escrever uma query SQL INSERT ? É algo muito simples.
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) {
}
}
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 ).
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.
Vou olhar o material, mas criei todos os campos como VARCHAR2 mesmo isso é assim mesmo
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.
Qual é a exceção impressa? Pelo que vimos, você imprime a exceção
Como você me aconselha a fazer para não ficar lento
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)
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.
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.