sql >> Databáze >  >> RDS >> PostgreSQL

Jak přistupovat k proceduře, která vrací setof refcursor z PostgreSQL v Javě?

returns setof refcursor znamená, že získáte běžnou ResultSet kde každý "řádek" obsahuje další ResultSet při volání getObject() :

Pro mě funguje následující:

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

V rámci psql můžete také použít select * from usp_sel_article_initialdata_new1() stačí použít FETCH ALL později. Příklad naleznete v příručce: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=>

(Vytvořil jsem fiktivní funkci pro výše uvedený příklad, která vrací pouze jeden řádek s hodnotou 1 pro první kurzor a 2 pro druhý kurzor)

Upravit :

Aby to fungovalo, musí to být spuštěno uvnitř transakce. Proto musí být automatické potvrzení vypnuto:

connection.setAutoCommit(false);


  1. Úložný modul Mysql pro tabulku protokolů

  2. Připojení MySQL není dostupné při použití SQLAlchemy (MySQL) a Flask

  3. Nelze vytvořit datový model entity - pomocí MySql a EF6

  4. Formátování čísel s čárkami v PostgreSQL