我可以动态截断表吗?

时间:2013-05-29 03:08:27

标签: postgresql plpgsql dynamic-sql

我有一个包含3个不同分区的表,这些分区在point_of_sale列上分开。我构建了一个视图(massive_table)来聚合来自这些分区的数据,如下所示:

CREATE VIEW massive_table as
SELECT * FROM massive_table_UK
UNION ALL
SELECT * FROM massive_table_US
UNION ALL
SELECT * FROM massive_table_DE;

每个massive_table_UK/US/DE表都有一个检查约束,因此point_of_sale列只能包含UKUS或{{1}的字符串值酌情。

在对其进行分区之前,我会通过执行以下操作为新数据准备表:

DE

然而,我更喜欢截断适当的分区。有可能动态地这样做吗?我查看了PostgreSQL PL/pgSQL documentation并说明了

  

参数符号的另一个限制是它们只能在SELECT,INSERT,UPDATE和DELETE命令中使用。在其他语句类型(通常称为实用程序语句)中,必须以文本方式插入值,即使它们只是数据值。

我对PostgreSQL编程很陌生,我很难理解这句话;我希望能够做的是有一个函数可以根据给定的DELETE FROM massive_table WHERE point_of_sale = 'UK'; 值截断相应的分区。这可能吗?

1 个答案:

答案 0 :(得分:1)

如果要将标识符(或其部分)作为参数传递,则需要使用EXECUTE的动态SQL:

CREATE OR REPLACE FUNCTION f_trunc(pos text)
 RETURNS void AS
$func$
BEGIN
EXECUTE format('TRUNCATE %I', massive_table_ || pos);
END
$func$ LANGUAGE plpgsql;

这是两个相关的答案,有很多解释和链接: