Java 如何从匿名PL/pgSQL块返回结果?
我使用的PostgreSQL版本是9.3 我已经编写了一段代码,其中包含以下内容:Java 如何从匿名PL/pgSQL块返回结果?,java,sql,hibernate,postgresql,Java,Sql,Hibernate,Postgresql,我使用的PostgreSQL版本是9.3 我已经编写了一段代码,其中包含以下内容: String queryString = "do $$\n" + "<< outerblock >>\n" + "DECLARE\n" + "table_name varchar DEFAULT 'partner.partner_statistic';\n" + "BEGIN\n" + "EXECUTE 'SELECT * FROM ' || table_name;\n"
String queryString = "do $$\n"
+ "<< outerblock >>\n"
+ "DECLARE\n"
+ "table_name varchar DEFAULT 'partner.partner_statistic';\n"
+ "BEGIN\n"
+ "EXECUTE 'SELECT * FROM ' || table_name;\n"
+ "END;\n"
+ "$$ LANGUAGE plpgsql; \n";
Query query = getSession().createSQLQuery(queryString);
List l = query.list();
如何重写查询以返回实际结果?根据,DO语句不能返回任何内容:
代码块被视为函数体
如果没有参数,返回void
如果DO中的代码用于生成行,则可以将它们放入临时表中,并让客户端从该表中进行选择。我正在寻找的解决方案是:
CREATE FUNCTION res() RETURNS SETOF partner.partner_statistic AS $$
<< outerblock >>
DECLARE
r partner.partner_statistic%rowtype;
table_name varchar DEFAULT 'partner.partner_statistic';
BEGIN
FOR r IN
SELECT * FROM partner.partner_statistic offset 0 limit 100
LOOP
RETURN NEXT r;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM res();
CREATE FUNCTION res()将partner.partner\u统计信息的集合返回为$$
>
声明
r合作伙伴。合作伙伴统计%rowtype;
表_name varchar默认值“partner.partner_statistic”;
开始
对于r IN
从partner.partner\u统计偏移量0限制100中选择*
环
返回下一个r;
端环;
回来
终止
$$语言plpgsql;
选择*FROM res();
相关文件参考
更新:
正如没有名字的@a_horse_在评论中所说,有更简单的解决方案:
CREATE FUNCTION res() RETURNS SETOF partner.partner_statistic AS $$
<< outerblock >>
DECLARE
r partner.partner_statistic%rowtype;
table_name varchar DEFAULT 'partner.partner_statistic';
BEGIN
RETURN QUERY SELECT * FROM partner.partner_statistic offset 0 limit 100
END;
$$ LANGUAGE plpgsql;
SELECT * FROM res();
CREATE FUNCTION res()将partner.partner\u统计信息的集合返回为$$
>
声明
r合作伙伴。合作伙伴统计%rowtype;
表_name varchar默认值“partner.partner_statistic”;
开始
返回查询从partner.partner\u统计偏移量0限制选择*100
终止
$$语言plpgsql;
选择*FROM res();
检查文档:,特别是“使用结果集执行语句”一节。@GordonLinoff那么什么是正确的查询?重写查询的准确程度如何?如果需要,我可以创建一个函数吗?是的。然而,问题是关于“匿名PL/PgSQL块”,所以答案仍然是不可能的。不需要循环:一个简单的返回查询…
就可以了。@A_horse_和\u No_名称你的意思是返回选择*FROM partner.partner\u统计偏移量0 limit 100
?我试过了,但收到了错误:RETURN不能在函数returning set中有参数
我的意思是RETURN query select…
(不是RETURN select…
)
CREATE FUNCTION res() RETURNS SETOF partner.partner_statistic AS $$
<< outerblock >>
DECLARE
r partner.partner_statistic%rowtype;
table_name varchar DEFAULT 'partner.partner_statistic';
BEGIN
RETURN QUERY SELECT * FROM partner.partner_statistic offset 0 limit 100
END;
$$ LANGUAGE plpgsql;
SELECT * FROM res();