ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于增加分区,当天的分区已经创建,怎么创建n天前的分区!已解决!供参考!

关于增加分区,当天的分区已经创建,怎么创建n天前的分区!已解决!供参考!

原创 Linux操作系统 作者:帅帅的动力 时间:2012-07-02 09:47:09 0 删除 编辑
[i=s] 本帖最后由 帅帅的动力 于 2012-7-2 09:24 编辑

我的分区表,要按照每一天来进行分区。下面是结构

partition PART_DTM_REPDATE_20120628 values less than (TO_DATE(' 2012-06-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace S_GSM_ORIGINAL_HIS
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition PART_DTM_REPDATE_20120629 values less than (TO_DATE(' 2012-06-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace S_GSM_ORIGINAL_HIS
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    )

我怎么样可以增加,20120627的分区,因为数据要补采,在线等!
采用split进行分区切割!如果此时表分区中游最大分区,可以用最大分区来进行分割,但是这个时候你只能增加距离最大分区最近的分区或者是没有间隔的分区,例如:最大分区为PART_DTM_REPDATE_20120629,你只能对应的增加PART_DTM_REPDATE_20120628,PART_DTM_REPDATE_20120627,如果此时分区表中有PART_DTM_REPDATE_20120629,PART_DTM_REPDATE_20120628,PART_DTM_REPDATE_20120623,而你想增加PART_DTM_REPDATE_20120626的分区,这种方法是行不通的!还是达不到我的要求!要求是随意增加某一天的表分区。

于是想到了这种方法。在增加的时候,根据要增加的某一天的分区,查询出距离这一天最近的分区,用最近的分区做split,从而分离出要增加的分区,进而补采数据。
附上代码供测试,修改相应的地方即可:
procedure auto_create_partition_d(dd in varchar2,omcid in varchar2) --,tablename in varchar2,tablespace_name in varchar2,partition_pre in varchar2,partition_column in varchar2,user_name in varchar2)
     as
     nextday varchar2(20);
     nextday1 varchar2(30);
     con int;
     max_partition varchar2(50);
     cursor partition_table is select * from t_gsm_partition_table t where t.omc_id=omcid;
     begin
         for tt in partition_table loop
         nextday:=dd;
         nextday1:=to_char(to_date(dd,'yyyymmdd')+1,'yyyy-mm-dd')||' 00:00:00';
         select count(*) into con from user_tab_partitions t where t.table_name=upper(tt.table_name) and t.partition_name=upper(tt.partition_pre||nextday);
         --通过查询找出距离补采日期最近的日期分区
        select t1.partition_name into max_partition from (select * from user_tab_partitions t1 where t1.table_name=tt.table_name and t1.partition_name>tt.partition_pre||dd order by t1.partition_name) t1 where rownum<=1;
       --需要补采的分区不存在,则创建
      if con=0 then
       --增加需要补采的日期的分区,采用split拆分现有分区的方法,
       execute immediate 'alter table '||tt.user_name||'.'||tt.table_name||' split partition '||max_partition||' at (to_date('''||nextday1||''',''SYYYY-MM-DD HH24:MI:SS'',''NLS_CALENDAR=GREGORIAN'')) into (partition '||tt.partition_pre||nextday||',partition '||max_partition||')';
        end if;
        end loop;
   end;


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26940217/viewspace-734269/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-05-13

  • 博文量
    17
  • 访问量
    17730