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

您需要使用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命令中使用。在其他语句类型(通常称为实用程序语句)中,必须以文本方式插入值,即使它们只是数据值。

最新更新