この例は、PostgreSQL™の組み込み関数upperの呼び出し方法を示します。 この関数は単に与えられた文字列引数を大文字に変換します。
CallableStatement upperProc = conn.prepareCall("{ ? = call upper( ? ) }");
upperProc.registerOutParameter(1, Types.VARCHAR);
upperProc.setString(2, "lowercase to uppercase");
upperProc.execute();
String upperCased = upperProc.getString(1);
upperProc.close();
PostgreSQL™のストアド関数は2つの方法で結果を返すことができます。 関数はrefcursor値として、または、何らかのデータ型のSETOFを返すことができます。 使用される戻り値の種類に応じて、関数の呼び出し方法が決まります。
セットとしてデータを返す関数をCallableStatementインタフェース経由で呼び出してはいけません。 その代わりに、通常のStatementやPreparedStatementインタフェースを使用してください。
Statement stmt = conn.createStatement();
stmt.execute("CREATE OR REPLACE FUNCTION setoffunc() RETURNS SETOF int AS "
+ "' SELECT 1 UNION SELECT 2;' LANGUAGE sql");
ResultSet rs = stmt.executeQuery("SELECT * FROM setoffunc()");
while (rs.next()) {
// 何らかの処理
}
rs.close();
stmt.close();
refcursorを返す関数を呼び出す場合、getObjectの戻り値の型をResultSetにキャストしなければなりません。
refcursorから作成されるResultSetのサポートに関して、現在注意しなければならない制限が1つあります。 カーソルとしてResultSetに返される場合であっても、すべてのデータを受け取り、クライアントにキャッシュされるという点です。 カーソルに基づいた結果の入手項で説明した、Statementの取り出しサイズは無視されます。 この制限は、サーバ側ではなくJDBCドライバの問題で、技術的には取り除くことができます。時間が取れないだけです。
// 関数呼び出しの設定
Statement stmt = conn.createStatement();
stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor AS '"
+ " DECLARE "
+ " mycurs refcursor; "
+ " BEGIN "
+ " OPEN mycurs FOR SELECT 1 UNION SELECT 2; "
+ " RETURN mycurs; "
+ " END;' language plpgsql");
stmt.close();
// カーソルを動作させるためにトランザクション内部にしなければなりません。
conn.setAutoCommit(false);
// プロシージャを呼び出し
CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");
proc.registerOutParameter(1, Types.Other);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
// 結果に対して何らかの処理を行う
}
results.close();
proc.close();
refcursor戻り値をカーソル名として直接扱うこともできます。 このためには、ResultSetのgetStringを使用してください。 背後のカーソル名を使って、自由に、FETCHやMOVEなどのカーソルコマンドを直接使用することができます。