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