无法在DDL中使用声明的变量

问题描述 投票:0回答:3

请考虑以下简单代码

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使整个语句动态化。

postgresql plpgsql dynamic-sql ddl
3个回答
0
投票

您不能将此作为查询参数传递。为此,您需要动态SQL:

DO $$
DECLARE
    _VARCHAR_SIZE int := 200;
BEGIN
    EXECUTE format(
        'create table mytable(id int primary key, name varchar( %s ));',
        _VARCHAR_SIZE
    );
END $$;

Demo on DB Fiddle


0
投票

如果使用psql,请尝试:

\set a 1

CREATE TABLE a (a varchar(:a));

0
投票

[内部Postgres知道两种类型的命令-命令(CREATEALTERDROP,..)和查询(SELECTINSERTUPDATEDELETE)。每个命令都有一些特殊的实现。查询与以下步骤一起实现:解析,分析,优化,执行。很有可能会重复执行查询。命令通常不会执行更多次。然后查询具有针对重复执行的特殊优化-参数化计划。该计划是查询执行步骤的顺序。通常它是相同的,但是参数(变量)是不同的-您可以搜索Pavel或Tomas,可以插入Pavel或Tomas。命令没有相似之处。

您可以在可能使用计划参数的任何地方使用plpgsql变量。 PlpgSQL运行时加入它。而且您不能在其他地方使用变量。 DDL语句(命令没有计划),然后您将无法在其中使用变量。在PLpgSQL中,只有[[dynamic sql-EXECUTE命令。

© www.soinside.com 2019 - 2024. All rights reserved.