【问题标题】:Hasura - query has no destination for result dataHasura - 查询没有结果数据的目的地
【发布时间】:2021-11-07 03:15:17
【问题描述】:

在 Hasura,我正在尝试编写一个基于 plpgsql 的函数,该函数应该返回 t_documents。该函数应该接受各种可选参数,基于参数值,它应该运行适当的 SQL(使用 IF 条件检查)并返回记录。这是我的目标。

我从没有参数的简单函数开始,该函数在 Hasura 中成功创建和跟踪,但是当尝试查询时抛出 "query has no destination for result data"

非常感谢任何有助于实现目标的帮助

CREATE OR REPLACE FUNCTION dms.fngetdocs()
 RETURNS SETOF dms.t_documents
 LANGUAGE plpgsql
 STABLE
AS $function$
BEGIN
SELECT *
    FROM dms.t_documents;
END;    
$function$

【问题讨论】:

  • 因为您是来自表格的SELECT-ing,所以您需要将结果放在某处,RETURN 将这些结果放在函数末尾
  • 更改为LANGUAGE SQL,您的功能将起作用。来自 Erwin Brandstetter 的更多扩展答案stackoverflow.com/a/69138809/1168212

标签: postgresql graphql plpgsql hasura


【解决方案1】:

每个返回行的 SQL 语句(如 SELECT,还有 INSERTRETURNING 等)都必须有一个结果数据的目标。这就是错误消息告诉您的内容。分配变量或返回给调用者。要丢弃结果,请使用PERFORM 而不是SELECT。见:

但您显然想要返回行。您的 PL/pgSQL 函数将像这样工作:

CREATE OR REPLACE FUNCTION dms.fngetdocs()
  RETURNS SETOF dms.t_documents
  LANGUAGE plpgsql STABLE PARALLEL SAFE AS
$func$
BEGIN
   RETURN QUERY
   SELECT * FROM dms.t_documents;
END
$func$

见:

当然,意义不大。无需调用该函数,您只需直接使用 SELECT * FROM dms.t_documents;

或者使用更简单的 SQL 函数,自动返回 SELECT 的结果:

CREATE OR REPLACE FUNCTION dms.fngetdocs()
  RETURNS SETOF dms.t_documents
  LANGUAGE sql STABLE PARALLEL SAFE AS
$func$
SELECT * FROM dms.t_documents;
$func$;

See the manual about the added PARALLEL SAFE.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多