【发布时间】:2014-07-15 15:51:44
【问题描述】:
我想编写一个 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 支持,但我找不到任何明确的实际示例。
【问题讨论】:
标签: sql postgresql jdbc