在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$
每个返回行的SQL语句(如SELECT
,但也有INSERT
和RETURNING
等)必须有一个结果数据的目标。这就是错误信息告诉你的。要么赋值变量,要么返回给调用者。若要丢弃结果,请使用PERFORM
而不是SELECT
。看到:
- SELECT在PL/pgSQL函数中引发异常 PL/pgSQL: PERFORM vs CALL
- PL/pgSQL函数中的SELECT或PERFORM
但你显然想返回行。您的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$
:
- 如何在PostgreSQL函数中返回SELECT的结果? 当然,
意义不大。您可以直接使用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$;
参见新增PARALLEL SAFE
的使用手册