returns setof refcursor
signifie que vous obtenez un ResultSet
normal où chaque "ligne" en contient une autre ResultSet lors de l'appel de getObject()
:
Ce qui suit fonctionne pour moi :
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())
{
......
}
}
}
Depuis psql
vous pouvez également utiliser select * from usp_sel_article_initialdata_new1()
il vous suffit d'utiliser FETCH ALL
ensuite. Voir le manuel pour un exemple :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=>
(J'ai créé une fonction factice pour l'exemple ci-dessus qui ne renvoie qu'une seule ligne avec la valeur 1
pour le premier curseur et 2
pour le second curseur)
Modifier :
Pour que cela fonctionne, cela doit être exécuté dans une transaction. Par conséquent, la validation automatique doit être désactivée :
connection.setAutoCommit(false);