请考虑以下简单代码
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语句(命令没有计划),然后您将无法在其中使用变量。在PLpgSQL中,只有[[dynamic sql-EXECUTE
命令。