如何从匿名PL / pgSQL块返回结果?

时间:2014-09-18 11:39:12

标签: java sql hibernate postgresql

PostgreSQL版本I使用的是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();

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

documentation,DO语句无法返回任何内容:

  

将代码块视为函数体   没有参数,返回空白

如果DO中的代码用于生成行,您可以将它们放入临时表中,并从该表中获取客户端SELECT。