我对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将变量解释为变量,而不是文字。
看起来不能将变量与DROP SCHEMA命令一起使用。您必须动态地构造一些SQL。答案似乎就在这里。重新发明轮子毫无意义。:-(
使用变量名删除架构
更新:我使用DynamicSQL尝试了以下操作,它很有效。我的结论是CREATE/DDROP 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$$;