【问题标题】:How to return a result from an anonymous PL/pgSQL block?如何从匿名 PL/pgSQL 块返回结果?
【发布时间】:2014-09-18 11:39:12
【问题描述】:

我使用的 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"
+ "END;\n"
+ "$$ LANGUAGE plpgsql; \n";
Query query = getSession().createSQLQuery(queryString);
List l = query.list();

在调试器中,我收到消息:

[org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:78)] : 查询没有返回任何结果。

在线上

List l = criteria.list();

如何重写查询以返回实际结果?

【问题讨论】:

标签: java sql hibernate postgresql


【解决方案1】:

根据documentation,DO 语句不能返回任何内容:

代码块被视为函数体 没有参数,返回 void

如果 DO 中的代码用于生成行,您可以将它们放入一个临时表中并让客户端从该表中选择。

【讨论】:

  • 那么我必须多精确地重写查询?
  • 如果需要,我可以创建一个函数吗?
  • 是的。但是问题是关于“匿名 PL/PgSQL 块”,所以答案仍然是不可能的。
【解决方案2】:

我正在寻找的解决方案是:

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

相关文档参考是here

更新: 正如@a_horse_with_no_name 在评论中所说,有更简单的解决方案:

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

【讨论】:

  • 不需要循环:一个简单的return query ... 就可以了。
  • @a_horse_with_no_name 你的意思是RETURN SELECT * FROM partner.partner_statistic offset 0 limit 100?我试过了,但收到了ERROR: RETURN cannot have a parameter in function returning set
  • 我的意思是return query select ...(不是return select ...
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 2011-01-10
  • 2021-02-01
  • 2016-04-27
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多