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();
アダルトレンタルサーバー