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();
StatementとPreparedStatementを適用する際の考慮事項は、CallableStatementでも適用されます。 また、さらに以下に示す1つの制限も考慮しなければなりません。
トランザクションの内部でのみストアド関数を呼び出すことができます。
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();