首页 > 解决方案 > 如何将 postgres 变量引用为变量,而不是文字

问题描述

我对在 postgres 中使用变量感到非常困惑。从 psql 命令行,我执行了:

DO $$
DECLARE
  NEW_SCHEMA          TEXT:= 'myschema';
BEGIN
  RAISE NOTICE 'Value of NEW_SCHEMA: %', NEW_SCHEMA;  -- A

  DROP SCHEMA IF EXISTS NEW_SCHEMA;               -- B
  CREATE SCHEMA IF NOT EXISTS NEW_SCHEMA;         -- C

END$$;

给我:

NOTICE:  Value of NEW_SCHEMA: myschema
NOTICE:  schema "new_schema" does not exist, skipping
DO

... 所以... at A,NEW_SCHEMA被解释为变量,但 atBC, 它被解释为文字,并NEW_SCHEMA创建了一个名为的新模式。

我怎样才能让 psql 将变量解释为变量,而不是文字。

标签: postgresql

解决方案


看起来您不能将变量与 DROP SCHEMA 命令一起使用。您必须动态构建一些 SQL。答案似乎在这里给出。重新发明轮子没有意义。:-)

使用变量名删除模式

更新:我使用动态 SQL 尝试了以下操作,它可以工作。我的结论是 CREATE/DROP SCHEMA 不允许变量。我注释掉了原始行以显示动态替换。

do $$
DECLARE
  NEW_SCHEMA TEXT:= 'myschema';
--  SQL TEXT := '';
BEGIN
  RAISE NOTICE 'Value of NEW_SCHEMA: %', NEW_SCHEMA; -- A

--  DROP SCHEMA IF EXISTS NEW_SCHEMA;                  -- B
--  CREATE SCHEMA IF NOT EXISTS NEW_SCHEMA;      -- C

  EXECUTE 'DROP SCHEMA IF EXISTS ' || NEW_SCHEMA;
  EXECUTE 'CREATE SCHEMA IF NOT EXISTS ' || NEW_SCHEMA;

END$$;

推荐阅读