↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 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();

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.