首页 > 解决方案 > PostgreSQL:来自变量的 SET 语句

问题描述

总的来说,与典型的编程语言相比,我发现 Postgres 中对变量的处理非常混乱,然后我来到了这个:

DO $$
DECLARE
    x INTEGER;
BEGIN
    x := 5; -- imagine doing some involved query to get to this value
    RAISE NOTICE 'x is %', x;
    SET app.foo = x;
    RAISE NOTICE 'app.foo is %', (SELECT current_setting('app.foo'));
END;
$$;

令我惊讶app.foo is x的是,在我期望的地方被打印出来app.foo is 5。从那里我得出的结论是 SET 语句的右侧没有被评估,它必须是恒定的。这是应该的吗?

有没有办法将查询结果分配给配置参数?

上下文:我正在使用current_setting行级安全性 ala https://www.enterprisedb.com/postgres-tutorials/how-implement-column-and-row-level-security-postgresql

标签: postgresql

解决方案


您需要使用EXECUTE

DO $$
DECLARE
    x INTEGER;
BEGIN
    x := 5; -- imagine doing some involved query to get to this value
    RAISE NOTICE 'x is %', x;
    EXECUTE 'SET app.foo =' || x::text;
    RAISE NOTICE 'app.foo is %', (SELECT current_setting('app.foo'));
END;
$$;

NOTICE:  x is 5
NOTICE:  app.foo is 5
DO

有关详细信息,请参阅执行。尤其是:

参数符号的另一个限制是它们只能在 SELECT、INSERT、UPDATE 和 DELETE 命令中使用。在其他语句类型(通常称为实用程序语句)中,您必须以文本方式插入值,即使它们只是数据值。


推荐阅读