无法在 DDL 中使用声明的变量
Unable to use declared variable in DDL
请考虑下面的简单代码
DO $$
DECLARE
_VARCHAR_SIZE int := 200;
BEGIN
create table mytable(
id int primary key,
name varchar( _VARCHAR_SIZE )
);
END $$;
执行上面的代码时出现错误
ERROR: syntax error at or near "_VARCHAR_SIZE"
LINE 14: name character varying(_VARCHAR_SIZE) NOT NULL,
^
SQL state: 42601
Character: 222
为什么 postgres 无法识别 DDL 中声明的变量
我不想使用 EXECUTE
使整个语句动态化。
您不能将此作为查询参数传递。为此,您确实需要动态 SQL:
DO $$
DECLARE
_VARCHAR_SIZE int := 200;
BEGIN
EXECUTE format(
'create table mytable(id int primary key, name varchar( %s ));',
_VARCHAR_SIZE
);
END $$;
如果你使用psql,请尝试:
\set a 1
CREATE TABLE a (a varchar(:a));
Postgres 内部知道两种类型的命令——命令(CREATE
、ALTER
、DROP
、..)和查询(SELECT
、INSERT
, UPDATE
, DELETE
).每个命令都有一些特殊的实现。查询与以下步骤一起实现:解析、分析、优化、执行。很有可能会重复执行查询。命令通常不会执行更多次。然后查询对重复执行有特殊的优化——参数化计划。该计划是查询执行步骤的序列。通常它是相同的,但参数(变量)不同 - 您可以搜索 Pavel 或 Tomas,您可以插入 Pavel 或 Tomas。命令没有类似的东西。
您可以在任何可能使用计划参数的地方使用 plpgsql 变量。 PlpgSQL 运行时加入它。而且您不能在其他地方使用变量。 DDL 语句(命令没有计划),然后你不能在那里使用变量。只有一种选择是 dynamic sql - EXECUTE
PLpgSQL 中的命令。
请考虑下面的简单代码
DO $$
DECLARE
_VARCHAR_SIZE int := 200;
BEGIN
create table mytable(
id int primary key,
name varchar( _VARCHAR_SIZE )
);
END $$;
执行上面的代码时出现错误
ERROR: syntax error at or near "_VARCHAR_SIZE"
LINE 14: name character varying(_VARCHAR_SIZE) NOT NULL,
^
SQL state: 42601
Character: 222
为什么 postgres 无法识别 DDL 中声明的变量
我不想使用 EXECUTE
使整个语句动态化。
您不能将此作为查询参数传递。为此,您确实需要动态 SQL:
DO $$
DECLARE
_VARCHAR_SIZE int := 200;
BEGIN
EXECUTE format(
'create table mytable(id int primary key, name varchar( %s ));',
_VARCHAR_SIZE
);
END $$;
如果你使用psql,请尝试:
\set a 1
CREATE TABLE a (a varchar(:a));
Postgres 内部知道两种类型的命令——命令(CREATE
、ALTER
、DROP
、..)和查询(SELECT
、INSERT
, UPDATE
, DELETE
).每个命令都有一些特殊的实现。查询与以下步骤一起实现:解析、分析、优化、执行。很有可能会重复执行查询。命令通常不会执行更多次。然后查询对重复执行有特殊的优化——参数化计划。该计划是查询执行步骤的序列。通常它是相同的,但参数(变量)不同 - 您可以搜索 Pavel 或 Tomas,您可以插入 Pavel 或 Tomas。命令没有类似的东西。
您可以在任何可能使用计划参数的地方使用 plpgsql 变量。 PlpgSQL 运行时加入它。而且您不能在其他地方使用变量。 DDL 语句(命令没有计划),然后你不能在那里使用变量。只有一种选择是 dynamic sql - EXECUTE
PLpgSQL 中的命令。