【问题标题】:Return multiple output variables from postgres function从 postgres 函数返回多个输出变量
【发布时间】:2021-11-05 00:24:48
【问题描述】:

当我运行下面的函数时,我在两个输出值 p_V_RESULT 和 p_V_ERROR_MSG 中得到空值。可能是什么问题?

RAISE INFO 显示分配的值:

INFO:  p_V_RESULT,T,p_V_ERROR_MSG
CREATE OR REPLACE   FUNCTION public.CheckSessionFailed (
IN p_V_CHK_SESSION_ID   bigint,
IN p_V_ERROR_COMMENT    varchar(1000) ,
OUT p_V_RESULT          char(1)         ,
OUT p_V_ERROR_MSG       varchar(1000)  
) 
AS $$
DECLARE
    p_V_RESULT  char(1) := 'T';
    p_V_ERROR_MSG varchar(1000)  := NULL;
    errMsg text;
    errState text;
    errContext text;
    r_rec record;
BEGIN
    p_V_RESULT   := 'T';
    p_V_ERROR_MSG  := '';

    UPDATE CHECK_SESSION
    SET SEVERITY_CD = 'FATAL',
        SESSION_COMMENT = 'Check Session Failed: ' || COALESCE(p_V_ERROR_COMMENT, ''),
        SESSION_END_DATE = NOW(),
        UPDATED_STATUS_FLG = 'Y',
        LAST_UPDATED = NOW()
    WHERE CHK_SESSION_ID = p_V_CHK_SESSION_ID;

    RAISE INFO 'p_V_RESULT,%,p_V_ERROR_MSG,%',p_V_RESULT,p_V_ERROR_MSG;

EXCEPTION
    WHEN OTHERS THEN
        GET STACKED DIAGNOSTICS
            errState = RETURNED_SQLSTATE,
            errMsg   = MESSAGE_TEXT,
            errContext = PG_EXCEPTION_CONTEXT;
        p_V_ERROR_MSG := 'SQL State: '|| errState || ';Message ' || errMsg || '; Context '|| errContext;
        p_V_RESULT := 'F';
END;
$$ LANGUAGE plpgsql;

【问题讨论】:

  • select * from CheckSessionFailed (1::bigint, 'pano'::varchar(1000));
  • 当我从 DECLARE 部分删除 p_V_RESULT 和 p_V_ERROR_MSG 时,它起作用了
  • 啊,是的。我没有看到双重定义。

标签: postgresql return plpgsql


【解决方案1】:

函数中的OUT 参数会自动定义一个具有参数名称的变量。

你的明确声明

DECLARE
    p_V_RESULT  char(1) := 'T';
    p_V_ERROR_MSG varchar(1000)  := NULL;

覆盖和隐藏这些参数。所以你最终分配给了错误的变量。

解决方案是删除这些第二个变量声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2012-04-30
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多