如何将Postgres变量作为变量而不是文字引用

时间:2018-12-03 20:44:58

标签: postgresql

我对在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

...所以,在ANEW_SCHEMA被解释为变量,但是在BC,它被解释为文字,并且创建了一个名为NEW_SCHEMA的新架构。

如何使psql将变量解释为变量,而不是文字。

1 个答案:

答案 0 :(得分:1)

您似乎无法在DROP SCHEMA命令中使用变量。您必须动态构建一些SQL。答案似乎在这里给出。重塑轮子毫无意义。 :-)

Drop a schema using variable name

更新:我使用动态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$$;