postgresql - 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 命令中使用。在其他语句类型(通常称为实用程序语句)中,您必须以文本方式插入值,即使它们只是数据值。
推荐阅读
- spring-integration - 没有发布者可以发布 TcpConnectionOpenEvent / TcpConnectionCloseEvent
- kubernetes - 无法创建 Istio bookinfo-gateway.yaml 网关
- angular - 读取 Firebase 数据项
- android - 在 Play 商店中通过初始付款启用年度订阅
- c - 如果在 C 中按整个数组的行打印,则二维数组输出不同的值
- swift - 非规范化数据时获取排序的 Firestore 文档
- mysql - MySQL 8 上 GeoDjango 的 SRID 问题
- java - Java - 创建游戏。套件、关联球员和球员套件字段
- django - order_by 基于条件
- javafx - 如何访问 Java 模块系统中的私有/包保护字段和方法?