PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come accedere alla procedura che restituisce setof refcursor da PostgreSQL in Java?

returns setof refcursor significa che ottieni un normale ResultSet dove ogni "riga" ne contiene un'altra ResultSet quando si chiama getObject() :

Per me funziona:

ResultSet rs = stmt.executeQuery("select * from usp_sel_article_initialdata_new1()");
if (rs.next())
{
  // first result set returned
  Object o = rs.getObject(1);
  if (o instanceof ResultSet)
  {
    ResultSet rs1 = (ResultSet)o;
    while (rs1.next())
    {
       int id = rs1.getInt(1);
       String name = rs1.getString(2);
       .... retrieve the other columns using the approriate getXXX() calls
    }
  }
}

if (rs.next()) 
{
  // process second ResultSet 
  Object o = rs.getObject(1);
  if (o instanceof ResultSet)
  {
    ResultSet rs2 = (ResultSet)o;
    while (rs2.next())
    {
       ......
    }
  }
}

Da psql puoi anche usare select * from usp_sel_article_initialdata_new1() devi solo usare FETCH ALL dopo. Vedere il manuale per un esempio:http://www. postgresql.org/docs/current/static/plpgsql-cursors.html#AEN59018

postgres=> select * from usp_sel_article_initialdata_new1();
 usp_sel_article_initialdata_new1
----------------------------------
 <unnamed portal 1>
 <unnamed portal 2>
(2 rows)

postgres=> fetch all from "<unnamed portal 1>";
 ?column?
----------
        1
(1 row)

postgres=> fetch all from "<unnamed portal 2>";
 ?column?
----------
        2
(1 row)

postgres=>

(Ho creato una funzione fittizia per l'esempio precedente che restituisce solo una singola riga con il valore 1 per il primo cursore e 2 per il secondo cursore)

Modifica :

Affinché funzioni, è necessario eseguirlo all'interno di una transazione. Pertanto l'autocommit deve essere disattivato:

connection.setAutoCommit(false);