Em 20/01/09, Romeryto Lira<romer...@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.
> 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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a