以下 select 语句是函数体的一部分(返回 void):
create or replace
function api.register(
auth_agent text,
auth_id text,
email text
)
returns void as $$
begin
select v1, v2
from auth.register(
auth_agent::core.auth_agent,
auth_id::text,
email::core.domain_email
) as ( v1 text, v2 text);
perform api.login(
auth_agent := v1,
auth_id := v2
);
end;
$$ security definer language plpgsql;
调用该函数会产生以下错误:
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 auth.register(auth_agent,text,domain_email) line 12 at SQL statement
SQL statement "select v1, v2
from auth.register(
auth_agent::core.auth_agent,
auth_id::text,
email::core.domain_email
) as ( v1 text, v2 text)"
PL/pgSQL function api.register(text,text,text) line 7 at SQL statement
我很困惑。这是怎么回事?
postgresql 版本: x86_64-pc-linux-gnu 上的 PostgreSQL 13.5,由 gcc 编译,ea47e69d19 p 313746c5ab,64 位
就像错误消息所说,每个
SELECT
都需要 PL/pgSQL 代码块中的 destination。要在没有目标的情况下执行某些操作,请使用 PERFORM
而不是 SELECT
。
这应该有效:
DECLARE
_v1 text;
_v2 text;
BEGIN
SELECT INTO _v1, _v2 -- use different variable names!
v1, v2
FROM auth.register(
auth_agent::core.auth_agent,
auth_id::text,
email::core.domain_email
) AS ( v1 text, v2 text);
PERFORM api.login(
auth_agent := _v1,
auth_id := _v2
);
SELECT INTO ...
声明所需的目的地。请注意我如何选择不同的变量名称以避免命名冲突。参见:
但这应该更便宜且更简单 - 除非您稍后在同一代码块中需要
_v1
和_v2
:
PERFORM api.login(auth_agent := v1, auth_id := v2)
FROM auth.register(auth_agent::core.auth_agent, auth_id::text, email::core.domain_email) AS (v1 text, v2 text);
从您披露的内容中我们无法确定。
相关: