Как ссылаться на переменные postgres как на переменные, а не на литералы - PullRequest
0 голосов
/ 03 декабря 2018

Я сильно запутался в использовании переменных в 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

... так что ... при A, NEW_SCHEMA интерпретируетсякак переменная, но в B и C она интерпретируется как литерал, и создается новая схема с именем NEW_SCHEMA.

Как мне получить psql для интерпретации переменных как переменныхне как литералы.

1 Ответ

0 голосов
/ 03 декабря 2018

Похоже, вы не можете использовать переменную с командой 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$$;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...