PostgreSQL 的存储函数返回结果有两种方式。函数或者返回一个指针值或者返回某种数据类型的SETOF。函数应该怎么调用取决于是哪一种的返回方式。
6.1.1 函数返回类型SETOF
返回集合数据的函数不能通过调用接口CallableStatement,而应该使用常规的Statement,
或者PreparedStatement 接口。
例6.2 从函数中读取SETOF类型值
| |
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()) {
// do something
}
rs.close();
stmt.close();
|
|
6.1.2 函数返回一个指针
调用返回指针的函数时,你必须映射返回类型的getObject到一个结果集中。
| |
Note
当前支持的从指针中创建ResultSet的方法有一些限制。这些限制是JDBC驱动程序而不是服务器的不足,在技术上是可以解决的,但是我们暂时没有时间。ResultSetMetaData不可用,调用getMetaData将返回空值;即使是一个基于ResultSet的指针,所有数据将被找到并且缓存在客户端。 “获得基于指针的结果集”章中描述的读取大小的参数将被忽略。
|
|
例6.3 从函数中获得指针的值
| |
// Setup function to call.
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();
// We must be inside a transaction for cursors to work.
conn.setAutoCommit(false);
// Procedure call.
CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");
proc.registerOutParameter(1, Types.Other);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
// do something with the results...
}
results.close();
proc.close();
|
|
把指针返回值直接看作游标名也是可能的,可以用ResultSet的getString实现。有了游标名,你可以自由地直接使用游标命令,像FETCH和MOVE
例6.4 把指针看作游标名
| |
Note
conn.setAutoCommit(false);
CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");
proc.registerOutParameter(1, Types.Other);
proc.execute();
String cursorName = proc.getString(1);
proc.close();
|
|