É 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 osvaldo.kuss...@gmail.com
Em 20/01/09, Romeryto Liraromer...@gmail.com 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.
SEE
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 ListMedicaoPrecipitacao
recuperarMedicoesPluviometricasDeVariosPostosPluviometricos(ListPostoPluviometrico
postosPluviometricos, Date dataInicial, Date dataFinal) {
Connection conn = null;
PreparedStatement pStatement = null;
ResultSet rs = null;
List MedicaoPrecipitacao result = new
ArrayListMedicaoPrecipitacao();
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));