| PostgreSQL 7.4.27 Documentation | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 31. JDBC Interface | Fast Forward | Next | 
PostgreSQL's JDBC driver fully supports calling PostgreSQL stored functions.
Example 31-4. Calling a built in stored function
This example shows how to call a PostgreSQL built in function, upper, which simply converts the supplied string argument to uppercase.
// Turn transactions off.
con.setAutoCommit(false);
// Procedure call.
CallableStatement upperProc = con.prepareCall("{ ? = call upper( ? ) }");
upperProc.registerOutParameter(1, Types.VARCHAR);
upperProc.setString(2, "lowercase to uppercase");
upperProc.execute();
String upperCased = upperProc.getString(1);
upperProc.close();
CallableStatement Interface	All the considerations that apply
	for Statement
	and PreparedStatement apply
	for CallableStatement but in addition
	you must also consider one extra restriction:
      
You can only call a stored function from within a transaction.
ResultSet from a stored functionPostgreSQL's stored function can return results by means of a refcursor value. A refcursor.
As an extension to JDBC,
	the PostgreSQL JDBC driver can
	return refcursor values
	as ResultSet values.
Example 31-5. Getting refcursor values from a function
When calling a function that returns
	  a refcursor you must cast the return type
	  of getObject to
	  a ResultSet
// Turn transactions off.
con.setAutoCommit(false);
// Procedure call.
CallableStatement proc = con.prepareCall("{ ? = call doquery ( ? ) }");
proc.registerOutParameter(1, Types.Other);
proc.setInt(2, -1);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
  // do something with the results...
}
results.close();
proc.close();It is also possible to treat the refcursor
      return value as a distinct type in itself. The JDBC driver
	provides
      the org.postgresql.PGRefCursorResultSet
	class for this purpose.
Example 31-6. Treating refcursor as a distinct type
con.setAutoCommit(false);
CallableStatement proc = con.prepareCall("{ ? = call doquery ( ? ) }");
proc.registerOutParameter(1, Types.Other);
proc.setInt(2, 0);
org.postgresql.PGRefCursorResultSet refcurs 
    = (PGRefCursorResultSet) con.getObject(1);
String cursorName = refcurs.getRefCursor();
proc.close();