↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 7.4
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

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

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。