【问题标题】:Function with SQL query has no destination for result data带有 SQL 查询的函数没有结果数据的目的地
【发布时间】:2013-06-02 14:53:57
【问题描述】:

我正在尝试创建一个返回 SELECTed 结果集的函数。 当我像这样select * from tst_dates_func() 调用我的 postgres 函数时,我收到如下所示的错误:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "tst_dates_func" line 3 at SQL statement

********** Error **********

ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function "tst_dates_func" line 3 at SQL statement

这是我创建的函数:

CREATE OR REPLACE FUNCTION tst_dates_func() 
    RETURNS TABLE( date_value date, date_id int, date_desc varchar) as
$BODY$   
BEGIN
    select a.date_value, a.date_id, a.date_desc from dates_tbl a;
END;
$BODY$
      LANGUAGE plpgsql;

我不确定为什么会出现上述错误。我想运行select * from tst_dates_func(); 并取回数据。如果需要,或者进一步加入结果集。这里有什么问题?

【问题讨论】:

  • LANGUAGE 应该是 SQL,不是吗?
  • 我需要它是 plpgsql 函数。加上语言是 SQL,我需要将查询语句放入带引号的字符串中,我不想这样做。
  • @ImtiazAhmad:使用language sql,您可以使用与plpgsql 相同的$body$ 引用。引用风格与语言无关。
  • 当我使用language sql 时,它不会编译该函数。我得到一个错误。 ERROR: syntax error at or near "select" LINE 5: select a.date_value, a.date_id, a.date_desc from dates_t...^

标签: sql postgresql plpgsql


【解决方案1】:

用普通的 SQL 来做

CREATE OR REPLACE FUNCTION tst_dates_func() 
    RETURNS TABLE( date_value date, date_id int, date_desc varchar) as
$BODY$   
    select a.date_value, a.date_id, a.date_desc from dates_tbl a;

$BODY$
      LANGUAGE sql;

如果你真的需要 plpgsql,请使用return query

CREATE OR REPLACE FUNCTION tst_dates_func() 
    RETURNS TABLE( date_value date, date_id int, date_desc varchar) as
$BODY$   
BEGIN
    perform SELECT dblink_connect('remote_db');
    return query
    select a.date_value, a.date_id, a.date_desc from dates_tbl a;

END;
$BODY$
      LANGUAGE plpgsql;

【讨论】:

  • 感谢您的回复。我也需要在函数中建立一个 dblink。在执行返回查询结果集之前。所以这是我想在返回查询子句之前添加的内容,当我添加它时,我会收到与上述类似的错误。 SELECT dblink_connect('remote_db') 我怎样才能将它包含在上面的 plpgsql 函数中?提前谢谢你
  • @Clodoaldo Neto,+1 太棒了!
  • 工作得很好,谢谢。但是如何在结果周围去掉“()”呢? (除了使用 unixs cut 将它们切掉)
  • PostgreSQL 12中可能需要和额外的RETURN;
【解决方案2】:
In PLPGSQL - use RETURN QUERY

CREATE OR REPLACE FUNCTION tst_dates_func() 
    RETURNS TABLE( date_value date, date_id int, date_desc varchar) as
$BODY$   
BEGIN
    RETURN QUERY (select a.date_value, a.date_id, a.date_desc from dates_tbl a);
END;
$BODY$
    LANGUAGE plpgsql;

【讨论】:

  • 当您回答时,建议对您的回答指定一些描述。
  • 特别是因为另一个答案已经发布了一些显然有效的代码。你的答案提供了其他答案没有的什么?
  • 我的回答地址在LANGUAGE PLPGSQL中的使用; - 与原始问题一样 第一个答案建议使用 LANGUAGE SQL 而不是 plpgsql 当需要 PlPgsql 的其他功能时 - 这是有效的语法 我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多