如何动态地为分区命名。我有一个要求,我每月创建间隔分区。我想给'1-jan-2014','2014年2月1日'作为分区名称?请建议方法?
答案 0 :(得分:0)
我在这看到一些问题因为区间分区有系统生成的分区名称... 因此,您必须在创建后更改此生成的名称,此问题在此处得到解决:
或在这里
http://bobjankovsky.org/show.php?seq=90
您可以创建一个定期更改分区名称的作业。
答案 1 :(得分:0)
如果要将分区添加到现有表中,则需要动态执行该分区。并且由于您希望名称在日期元素分隔符中包含破折号,因此分区名称必须是带引号的标识符,这将使得稍后使用它们显然更加复杂。
如果您的表最初具有命名分区:
create table t42 (date_col date, other_col varchar2(10))
partition by range (date_col)
(
partition "Pre-2014" values less than (date '2014-01-01'),
partition "1-jan-2014" values less than (date '2014-02-01'),
partition "1-feb-2014" values less than (date '2014-03-01'),
partition "1-mar-2014" values less than (date '2014-04-01'),
partition "1-apr-2014" values less than (date '2014-05-01')
);
然后您可以手动添加新的命名分区:
alter table t42 add partition "1-may-2014" values less than (date '2014-06-01');
alter table t42 add partition "1-jun-2014" values less than (date '2014-07-01');
如果要基于sysdate
(或任何日期)添加新分区,则需要动态SQL来生成该命令;这里是一个匿名的块,但是如果你想在日期中传递日期,你就可以有一个程序:
begin
execute immediate 'alter table t42 add partition "'
|| to_char(trunc(sysdate, 'MM'), 'FMdd-mon-yyyy')
|| '" values less than (date '''
|| to_char(add_months(trunc(sysdate, 'MM'), 1), 'YYYY-MM-DD')
|| ''')';
end;
/
今天将生成并执行命令:
alter table t42 add partition "1-jul-2014" values less than (date '2014-08-01')
然后您可以看到分区按您的意愿命名:
select partition_name from user_tab_partitions order by partition_position;
PARTITION_NAME
------------------------------
Pre-2014
1-jan-2014
1-feb-2014
1-mar-2014
1-apr-2014
1-may-2014
1-jun-2014
1-jul-2014