我有一个模式(称为import
),其中数据作为表导入,以及一个处理所有数据的函数。之后,我想将这些表移到另一个模式(称为data_archive
)中。现有功能效果很好,但我找不到更改架构的方法;这是我为此编写的一个函数:
我的想法是根据 aselect
在为此管理制作的表格上提供的标准创建表格列表,然后遍历此列表并执行以下操作Alter table xxxx SET schema data_archive
:
CREATE OR REPLACE FUNCTION archive_datasets()
RETURNS VOID AS
$BODY$
DECLARE
table_rec record;
BEGIN
FOR table_rec IN
SELECT t.table_name
FROM information_schema.tables AS t
WHERE table_schema = 'import'
AND quote_ident(t.table_name) IN (
SELECT "table_name"
FROM data_sets
WHERE status IN ('Processed', 'Archived', 'Deleted')
)
LOOP
ALTER TABLE quote_ident(table_rec.table_name) SET schema data_archived;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
但我收到此错误消息:
ERROR: syntax error at or near "(" LINE 28: ALTER TABLE quote_ident(table_rec.table_name) SET schema ...
所以我的问题是如何将表的名称传递给这个ALTER TABLE
查询?或者我做错了什么?
我使用 PostgreSQL 9.3。
问题是您不能像
ALTER TABLE
上面那样在直接的 SQL 语句中使用参数作为对象名称(表、列等)。我在这里使用“直接”作为“动态”的对立面——你需要的东西:
备注:
format()
格式%I
说明符来正确引用对象名称。quote_ident()
这种方法比使用串联字符串常量和一些调用来构建查询更具可读性。它存在于 9.1 和更新版本中。quote_ident('This_table') IN ('This_table')
,这是不正确的。quote_ident()
两边都使用- 或者更容易省略引用并比较字符串值。