我正在创建分区表,因此我需要使用可能包含一行或多行成本中心数据的输入表为每个成本中心创建一个表。 输入表有一个名为 'cost_center'
的列。 我正在使用Postgresql 9.5。
为了连接表名,我编写了以下内容:
select cost_cent,
concat('a_save_tbl_', cost_center) hold_tbl_name from a_input_tbl
limit 1;
此命令返回正确的表名'a_save_tbl_AA'
。 然后我尝试了以下变体:
query1 := format('drop if exists %I, hold_tbl_name);
没有成功。 我找不到正确的代码来删除、创建和填充新表。 我阅读了很多帖子和文档,但是,所有内容都返回语法错误。 我将不胜感激。
drop if exists %I
在语法上是错误的。应该是drop table if exists %I
话虽如此,您的表a_save_tbl_AA
很可能是在不使用双引号的情况下正常创建的。带有 %I
的格式函数将参数值视为 SQL 标识符,并在必要时对其进行双引号。
所以,如果你的cost_center
是大写('AA'
),最好转换并传递小写来代替%I
。下面的代码有效,可能对您的实际要求有用。
DO $$
DECLARE
l_hold_tbl_name TEXT;
query1 text ;
query2 text ;
BEGIN
SELECT Concat('a_save_tbl_', cost_center)
INTO l_hold_tbl_name
FROM a_input_tbl limit 1;
query1 := format('drop table if exists %I', lower(l_hold_tbl_name));
query2 := format('create table %I as select 2 as id',lower(l_hold_tbl_name));
EXECUTE query1;
EXECUTE query2;
END $$;
请参阅演示以了解引号的工作原理。