Psql仍然抛出"查询没有结果数据的目的地"即使用"返回查询"

时间:2017-03-07 11:55:51

标签: sql postgresql psql

我有一个plpgsql函数,如下所示:

CREATE OR REPLACE FUNCTION func1(....)
RETURNS TABLE(aa integer, bb integer, cc timestamp) 
AS $BODY$
BEGIN
  CREATE TEMPRORAY TABLE tmp 
  AS SELECT .....;

  WITH RECURSIVE x AS (
    SELECT * 
    FROM tmp 
    WHERE some stuff ...)
  SELECT * 
  FROM tbl1 
  WHERE ....;
END;
$BODY$
LANGUAGE plpgsql;

当我将其称为select func1(1, 2, 3)

时,它会引发异常
ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.

然而,将return query插入身体并不会有任何帮助:

return query
WITH RECURSIVE x AS ( ....)

并且错误保持不变。

2 个答案:

答案 0 :(得分:0)

RETURN QUERY应该解决问题,以便您的问题可能在其他地方。

一个主要观点是在函数中创建临时表有一些非常不幸的含义(由于临时表被锁定,很容易遇到锁定耗尽问题)。您可以更好地 MUCH 在查询中移动内联。

其次,这可能是一个与你想象的不同的SELECT陈述。 PL / PGSQL有时会引发错误,指向函数的结尾,因此您需要查看整个函数以查找错误。因此,如果您需要,请对代码进行模糊处理,但目前我们可以做的最好的事情是“您的错误可能在其他地方。请仔细检查。”

答案 1 :(得分:0)

显示此示例,它可以正常工作

CREATE OR REPLACE FUNCTION test()
  RETURNS TABLE(_id integer, _name text) AS
$BODY$
BEGIN

    return QUERY
    with x as (select id,name from my_table)
    select id,name from x;

END;$BODY$
  LANGUAGE plpgsql STABLE