如何在 DDL 命令中使用子查询作为数据库名称?
How to use a subquery as a database name in a DDL command?
我想知道是否可以在 PostgreSQL (9.5.1) DDL 语句中使用子查询的结果作为数据库名称。
例如,我想用类似的东西改变当前数据库:
ALTER DATABASE (SELECT current_database()) SET a_var TO 'a_value';
如果我运行这个,会出现错误:
ERROR: syntax error at or near "("
LINE 1: ALTER DATABASE (SELECT current_database()) SET ...
使用子查询的正确方法是什么(如果可能的话)?
为此您需要动态 SQL:
DO
$do$
BEGIN
EXECUTE format($f$ALTER DATABASE %I SET x.a_var TO 'a_value'$f$, current_database());
END
$do$;
使用 format()
安全地转义数据库名称。
顺便说一句,取消设置:
ALTER DATABASE your_db RESET x.a_var;
查看当前设置:
SELECT current_setting('x.a_var');
(在您开始新会话之前,数据库默认未激活。)
相关:
- Table name as a PostgreSQL function parameter
我想知道是否可以在 PostgreSQL (9.5.1) DDL 语句中使用子查询的结果作为数据库名称。
例如,我想用类似的东西改变当前数据库:
ALTER DATABASE (SELECT current_database()) SET a_var TO 'a_value';
如果我运行这个,会出现错误:
ERROR: syntax error at or near "("
LINE 1: ALTER DATABASE (SELECT current_database()) SET ...
使用子查询的正确方法是什么(如果可能的话)?
为此您需要动态 SQL:
DO
$do$
BEGIN
EXECUTE format($f$ALTER DATABASE %I SET x.a_var TO 'a_value'$f$, current_database());
END
$do$;
使用 format()
安全地转义数据库名称。
顺便说一句,取消设置:
ALTER DATABASE your_db RESET x.a_var;
查看当前设置:
SELECT current_setting('x.a_var');
(在您开始新会话之前,数据库默认未激活。)
相关:
- Table name as a PostgreSQL function parameter