总的来说,我发现与典型的编程语言相比,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命令中使用。在其他语句类型(通常称为实用程序语句)中,必须以文本方式插入值,即使它们只是数据值。