我想编写一个PLPGSQL(针对PostgreSQL 9.3)函数,该函数将返回多个结果集(即通过JDBC访问时我会调用getMoreResults()来移动到下一组行),但是我所做的一切我试过给我一个语法错误或简单地将所有内容连接成一个结果集。
以下是一个说明问题的简单示例:
CREATE TYPE my_type AS (a BIGINT, b TEXT, c DOUBLE PRECISION);
CREATE FUNCTION my_func(_arg1 TEXT, _arg2 TEXT)
RETURNS SETOF my_type
AS $$
BEGIN
RETURN QUERY SELECT a, b, c FROM table1 WHERE d = _arg1 AND e = _arg2;
RETURN QUERY SELECT a, b, c FROM table2 WHERE d = _arg1 AND e = _arg2;
END;
$$ LANGUAGE PLPGSQL;
当我运行它时,table1和table2中的行被连接在一起成为一个结果集。
我也试过像
这样的东西CREATE FUNCTION my_func(_arg1 TEXT, _arg2 TEXT)
RETURNS SETOF TABLE(a BIGINT, b TEXT, c DOUBLE PRECISION)
但这只会导致语法错误:ERROR: syntax error at end of input
。
为了完整起见,这里是我想用来处理结果的Java代码。我很确定问题出在db函数端,但我可能误解了JDBC API应该如何工作。
(为了便于阅读,删除了错误处理和资源关闭)
PreparedStatement statement = connection.prepareStatement("SELECT * FROM my_func(?, ?);");
statement.setString(1, "foo");
statement.setString(2, "bar");
statement.execute();
ResultSet rs1 = statement.getResultSet();
while(rs1.next()) {
// Process first result set
}
statement.getMoreResults();
ResultSet rs2 = statement.getResultSet();
while(rs2.next()) {
// Process second result set
}
基于我迄今为止所做的搜索,似乎这种类型的解决方案应该得到JDBC和PostgreSQL的支持,但我找不到任何明确的实例。
答案 0 :(得分:1)
从PostgreSQL中获取多个结果集的唯一方法(在编写时 - 从PostgreSQL 9.4开始)是通过返回refcursors。
为每个结果集定义函数RETURNS SETOF refcursor
,然后return a cursor。 PgJDBC将认识到它是一个refcursor并为你取得它;见the documentation。
答案 1 :(得分:0)
略微修改你的问题,但是如果你不必使用某个函数,你可以像通常使用JDBC那样从PostgreSQL中获取多个ResultSet。只需使用getMoreResults()
连接查询并处理每个结果集。请参阅Queries returning multiple result sets。