已结束支持的版本: 7.4
历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.
31.5. 调用存储函数 #
PostgreSQL 的 JDBC 驱动完全支持调用 PostgreSQL 存储函数。
例 31.4. 调用一个内置存储函数
这个例子展示如何调用一个 PostgreSQL 内置函数 upper,它只是把提供的字符串参数转换为大写。
// Turn transactions off.
con.setAutoCommit(false);
// Procedure call.
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 接口
适用于 Statement
和 PreparedStatement 的所有注意事项同样适用于 CallableStatement,但此外你还必须考虑一个额外的限制:
只能在一个事务内部调用存储函数。
31.5.2. 从存储函数获取 ResultSet
PostgreSQL 的存储函数可以通过 refcursor 值返回结果。一个
refcursor。
作为对 JDBC 的扩展,PostgreSQL JDBC 驱动可以把
refcursor 值作为
ResultSet 值返回。
例 31.5. 从函数获取 refcursor 值
在调用一个返回
refcursor 的函数时,你必须把
getObject 的返回类型强制转换为
ResultSet
// Turn transactions off.
con.setAutoCommit(false);
// Procedure call.
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()) {
// do something with the results...
}
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();