如何在DDL命令中将子查询用作数据库名称?

时间:2016-04-03 23:48:58

标签: postgresql subquery dynamic-sql identifier

我想知道是否可以在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 ...

使用子查询的正确方法是什么(如果可能)?

1 个答案:

答案 0 :(得分:1)

您需要动态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');

(在开始新会话之前,数据库默认设置无效。)

相关: