使用 SELECT 语句时不使用值错误

问题描述 投票:0回答:1

以下 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 位

postgresql function plpgsql
1个回答
0
投票

就像错误消息所说,每个

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);

从您披露的内容中我们无法确定。

相关:

© www.soinside.com 2019 - 2024. All rights reserved.