31.5. Appeler des procédures stockées

Le pilote JDBC de PostgreSQL supporte totalement l'appel de procédures stockées PostgreSQL.

Exemple 31-4. Appeler une fonction interne

Cet exemple montre comment appeler une fonction interne de PostgreSQL, upper, qui convertit simplement l'argument fourni en majuscule.

// Désactive les transactions.
con.setAutoCommit(false);
// Appel de procédure.
CallableStatement upperProc = con.prepareCall("{ ? = call upper( ? ) }");
upperProc.registerOutParameter(1, Types.VARCHAR);
upperProc.setString(2, "minuscule vers majuscule");
upperProc.execute();
String upperCased = upperProc.getString(1);
upperProc.close();

31.5.1. Utiliser l'interface CallableStatement

Toutes les considérations s'appliquant à Statement et PreparedStatement s'appliquent à CallableStatement mais vous devez considérer une restriction supplémentaire :

31.5.2. Obtenir un ResultSet à partir d'une procédure stockée

Les procédures stockées de PostgreSQL peuvent renvoyer des résultats au moyen d'une valeur de type refcursor. Un refcursor.

En extension de l'API JDBC, le pilote JDBC de PostgreSQL peut renvoyer des valeurs de type refcursor comme valeurs ResultSet.

Exemple 31-5. Obtenir des valeurs refcursor à partir d'une fonction

Lors de l'appel d'une fonction renvoyant un refcursor, vous devez convertir le type de retour de getObject à un ResultSet

// Désactive les transactions.
con.setAutoCommit(false);
// Appel de procédure.
CallableStatement proc = con.prepareCall("{ ? = call fait_requete ( ? ) }");
proc.registerOutParameter(1, Types.Other);
proc.setInt(2, -1);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
  // faire quelque chose avec les résultats...
}
results.close();
proc.close();

Il est aussi possible de traiter la valeur de retour refcursor comme un type distinct en lui-même. Le pilote JDBC fournit la classe org.postgresql.PGRefCursorResultSet dans ce but.

Exemple 31-6. Traiter refcursor comme un type distinct

con.setAutoCommit(false);
CallableStatement proc = con.prepareCall("{ ? = call fait_requete ( ? ) }");
proc.registerOutParameter(1, Types.Other);
proc.setInt(2, 0);
org.postgresql.PGRefCursorResultSet refcurs 
    = (PGRefCursorResultSet) con.getObject(1);
String cursorName = refcurs.getRefCursor();
proc.close();