首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POSTGRES存储过程和设置会话变量

POSTGRES存储过程和设置会话变量
EN

Stack Overflow用户
提问于 2021-12-16 21:27:25
回答 1查看 714关注 0票数 1

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

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

(1 row)

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

app=#
EN

回答 1

Stack Overflow用户

发布于 2021-12-16 21:50:02

根据手册的说法

代码语言:javascript
复制
SET session "myapp.userId" = userId

等于

代码语言:javascript
复制
SET session "myapp.userId" = 'userId'

因此,输入参数名userId被认为是运行时参数的新值,而不是输入参数值'myuserId‘。

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

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION setUserId(userIdtext)
returns void AS $$
    BEGIN
    EXECUTE '
    SET session "myapp.userId" = ' || quote_nullable(userId) ;
    END
$$ LANGUAGE plpgsql;

[医]小提琴中的演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70385819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档