PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie greife ich auf die Prozedur zu, die setof refcursor von PostgreSQL in Java zurückgibt?

returns setof refcursor bedeutet, dass Sie ein reguläres ResultSet erhalten wobei jede "Zeile" eine andere enthält ResultSet beim Aufruf von getObject() :

Folgendes funktioniert bei mir:

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())
    {
       ......
    }
  }
}

Aus psql Sie können auch select * from usp_sel_article_initialdata_new1() verwenden Sie müssen nur FETCH ALL verwenden danach. Ein Beispiel finden Sie im Handbuch: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=>

(Ich habe für das obige Beispiel eine Dummy-Funktion erstellt, die nur eine einzelne Zeile mit dem Wert 1 zurückgibt für den ersten Cursor und 2 für den zweiten Cursor)

Bearbeiten :

Damit dies funktioniert, muss dies innerhalb einer Transaktion ausgeführt werden. Dazu muss Autocommit abgeschaltet werden:

connection.setAutoCommit(false);