【问题标题】:POSTGRES stored procedure and SET session variablePOSTGRES 存储过程和 SET 会话变量
【发布时间】:2021-12-16 21:27:25
【问题描述】:

有人知道为什么会这样吗?当我在其他存储过程中尝试时,文本通常会替换为指定为存储过程参数的值。

CREATE OR REPLACE FUNCTION setUserId(userId text)
returns void AS $$
    BEGIN 
    SET session "myapp.userId" = userId;
    END
$$ LANGUAGE plpgsql;
app=# select * from setUserId('myuserId');
 setuserid
-----------

(1 row)

app=# select current_setting('myapp.userId');
 current_setting
-----------------
 userid
(1 row)

app=#

【问题讨论】:

    标签: postgresql stored-procedures


    【解决方案1】:

    根据manual

    SET session "myapp.userId" = userId
    

    等价于

    SET session "myapp.userId" = 'userId'
    

    因此输入参数名称userId 被视为运行时参数的新值,而不是输入参数值“myuserId”。

    如果希望运行时参数考虑输入参数userId的值'myuserId',则需要动态语句:

    CREATE OR REPLACE FUNCTION setUserId(userIdtext)
    returns void AS $$
        BEGIN
        EXECUTE '
        SET session "myapp.userId" = ' || quote_nullable(userId) ;
        END
    $$ LANGUAGE plpgsql;
    

    dbfiddle中的演示

    【讨论】:

    • 或者使用set_config('myapp.userId', userid)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多