É isto que acontece. Mas tipo, a natureza do addBatch é guardar na memória as consultas para poder fazê-las todas de uma vez para ganhar em eficiência se não me engano.
Um exemplo é o código deste link: http://www.java2s.com/Code/JavaAPI/java.sql/PreparedStatementaddBatch.htm Ele dá os addBatch: e depois dá o update, tudo de uma vez no statement.executeBatch(); Eu fiz desse jeito mas no Postgrees dá o exceção que coloquei no primeiro email. E este exemplo anterior é com MySQL., aí pode ser algo do postgrees pois a exceção é especifica dele. Aí continuo na dúvida. -------------------------------------------------------------------------------------------------- "Se um dia tiver que escolher entre o mundo e o amor... Lembre-se: Se escolher o mundo, ficará sem o amor, mas se escolher o amor, com ele conquistará o mundo." (Albert Einstein) ╔════════════════════════════════════════╗ ROMERYTO VIEIRA LIRA Bacharelando em Ciência da Computação - UFCG Membro do SegHidro2 - LSD - http://seghidro.lsd.ufcg.edu.br Membro do Grupo de Suporte Guardians - www.lcc.ufcg.edu.br Página Pessoal: http://romeryto.googlepages.com Blog: http://olhartecnologico.blogspot.com ╚════════════════════════════════════════╝ Pensou em imprimir este e-mail? Isto é mesmo necessário? Poupe o meio ambiente. ---------------------------------------------------------------------------------------------------------------------------- 2009/1/20 Osvaldo Kussama <[email protected]> > Em 20/01/09, Romeryto Lira<[email protected]> escreveu: > > Olá pessoal, > > > > Estou desenvolvendo uma aplicação que acessa o Postgres. > > Estou acessando o mesmo via JDBC. Porém o mesmo retorna um exceção > > específica do postgree quando uso o comando addBatch quando uso o > > executeBatch do objeto PreparedStatement. > > > > org.postgresql.util.PSQLException: Um resultado foi retornado quando > nenhum > > era esperado. > > SEEEEEE > > at > > > org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleResultRows(AbstractJdbc2Statement.java:2501) > > at > > > org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1269) > > at > > > org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351) > > at > > > org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674) > > at > > > br.edu.ufcg.lsd.seghidro.server.persistencia.PersistenciaFacedeBDJDBC.getAllMedicoesPluviometricasFromMunicipio(PersistenciaFacedeBDJDBC.java:252) > > at > > > br.edu.ufcg.lsd.seghidro.server.testes.PersistenciaFacedeJDBCTestPluviometria.testGetAllMedicoesPluviometricasFromMunicipio_1(PersistenciaFacedeJDBCTestPluviometria.java:108) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > > at java.lang.reflect.Method.invoke(Unknown Source) > > at > > > org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99) > > > > Usando agora o método executeQuery usando o *addBatch* mas o mesmo não > > armazena > > de forma correta as consultas a serem feitas, ou seja, a mesma só executa > > para o último PostoPluviométrico(ver código abaixo): > > > > *private static List<MedicaoPrecipitacao> > > > recuperarMedicoesPluviometricasDeVariosPostosPluviometricos(List<PostoPluviometrico> > > postosPluviometricos, Date dataInicial, Date dataFinal) { > > Connection conn = null; > > PreparedStatement pStatement = null; > > ResultSet rs = null; > > List <MedicaoPrecipitacao> result = new > > ArrayList<MedicaoPrecipitacao>(); > > try { > > conn = GerenciadorDeConexao.getConnection(); > > > > String query = "select m.* from " + > > "medicoes_pluviometria_view m " + > > "where m.codigo_posto=? and " + > > "m.data between ? and ? " + > > " order by data" ; > > > > pStatement = conn.prepareStatement(query); > > > > for (PostoPluviometrico postoPluviometrico : > > postosPluviometricos) { > > > > pStatement.setInt(1, postoPluviometrico.getCodigo()); > > pStatement.setDate(2, new > > java.sql.Date(dataInicial.getTime())); > > pStatement.setDate(3, new > > java.sql.Date(dataFinal.getTime())); > > > > pStatement.addBatch(); > > > > > > } > > Eu não entendo muito de Java mas este "}" acima não está em lugar errado? > Ele vai executar o comando abaixo apenas com o último elemento do loop. > > > > > > rs = pStatement.executeQuery(); > > (Depois disso o ResultSet só tem resultados do último posto > > pluviométrico) > > while (rs.next()) { > > MedicaoPrecipitacao m = new MedicaoPrecipitacao(); > > m.setCodigo(rs.getInt(1)); > > m.setData(rs.getDate(2)); > > m.setValor(rs.getDouble(3)); > > m.setCodigoPostoPluviometrico(rs.getInt(4)); > > result.add(m); > > > > } > > } catch (SQLException e) { > > System.out.println("Não conseguiu acessar o Banco de > Dados."); > > e.printStackTrace(); > > } finally { > > try { > > conn.close(); > > pStatement.close(); > > if(rs!=null){ > > rs.close(); > > } > > } catch (SQLException e) { > > e.printStackTrace(); > > } catch (Exception e) { > > e.printStackTrace(); > > } > > } > > return result; > > } > > > > *Vi na net exemplos que usam esta funcionalidade desta forma com sucesso > mas > > não era com o postgres. Como a exceção que apareceu foi especifica do > mesmo > > resolvi mandar esta duvida aqui pra lista. > > > > No caso, como faço para o addBatch colocar no batch realmente todas as > > consultas e não só para última. O que me parece é que no postgres quando > se > > dá um addBatch, a consulta armazenada anteriormente é sobrescrita, o que > > pela natureza deste método não era para acontecer. > > > > Fico muito grato pela a atenção* *e agradeço desde já a ajuda.* > > * > > > Osvaldo > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral >
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
