动态创建分区名称为sysdate?

时间:2014-07-03 10:16:26

标签: oracle oracle11g database-partitioning

如何动态地为分区命名。我有一个要求,我每月创建间隔分区。我想给'1-jan-2014','2014年2月1日'作为分区名称?请建议方法?

2 个答案:

答案 0 :(得分:0)

我在这看到一些问题因为区间分区有系统生成的分区名称... 因此,您必须在创建后更改此生成的名称,此问题在此处得到解决:

https://dba.stackexchange.com/questions/33225/rename-interval-partitioning-system-generated-partition-names

或在这里

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