31.5. ストアド関数の呼び出し

PostgreSQL JDBCドライバはPostgreSQLのストアド関数の呼び出しを完全にサポートしています。

例 31-4. 組み込みストアド関数の呼び出し

この例は、PostgreSQLの組み込み関数upperの呼び出し方法を示します。 この関数は単純に与えられた文字列引数を大文字に変換します。

// トランザクションを無効にする
con.setAutoCommit(false);
// プロシージャ呼び出し
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();

31.5.1. CallableStatementインタフェースの使用

StatementPreparedStatementを適用する際の考慮事項は、CallableStatementでも適用されます。 また、さらに以下に示す1つの制限も考慮しなければなりません。

31.5.2. ストアド関数からResultSetを取り出す

PostgreSQLストアド関数はrefcursor値として結果を返すことができます。

JDBCに対する拡張として、PostgreSQL JDBCドライバはResultSet値としてrefcursor値を返すことができます。

例 31-5. 関数からrefcursor値を得る

refcursorを返す関数を呼び出す時、getObjectの戻り値の型をResultSetにキャストしなければなりません。

// トランザクションを無効にする。
con.setAutoCommit(false);
// プロシージャの呼び出し
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()) {
  //結果を使った何らかの処理...
}
results.close();
proc.close();

また、refcursor型の戻り値を自身とは別の型として扱うこともできます。 JDBCドライバはこの目的のためにorg.postgresql.PGRefCursorResultSetを提供しています。

例 31-6. refcursor を別の型として扱う

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();