Oracle Split Partitions

1. 创建分离分区的存储过程

CREATE OR REPLACE Procedure SP_Split_Partition(
v_table_name_in         in varchar2,
v_part_name_prifex_in   in varchar2,
v_split_partition_source_in in varchar2,
v_tablespace_name_in in varchar2,
v_field_tablespace_name_in in varchar2,
v_create_partition_count_in in number
) is
  /*
      名称:SP_Split_Partition
      描述:oracle分区表分离分区的存储过程
      参数说明:
          v_table_name_in                   分区表表名称
          v_part_name_prifex_in             分区名称前缀
          v_split_partition_source_in       要分离的目标分区
          v_tablespace_name_in in           分区表所在表空间
          v_field_tablespace_name_in        特别字段特别分区SQL
          v_create_partition_count_in       从现在开始创建多少个分区
  */
  -- Local variables here
  i integer;

  ---最后一个分区信息
  cursor cur_utp(v_table_name_in in user_tab_partitions.table_name%TYPE) is
    select *
    from (select utp.table_name,
                   utp.tablespace_name,
                   utp.partition_name,
                   utp.high_value,
                   utp.high_value_length,
                   utp.partition_position
              from user_tab_partitions utp
             where utp.table_name = UPPER(v_table_name_in)
             and utp.high_value_length<>8
             order by utp.partition_position desc
            ) utp
     where rownum = 1;

  v_high_value         varchar2(255); --less than value信息
  v_partition_max_date date; ---- 当前最大分区
  v_sqlexec            VARCHAR2(2000); --DDL语句变量
  v_count              number := 0;
  v_interver           number := 1; --步长间隔 单位(月)
  v_tablespace_name    varchar2(200);
  
  v_max_date_this_time date;

begin
  -- 根据v_create_partition_count_in, 得到最后要生成的分区日期
  v_max_date_this_time:=last_day(add_months(trunc(SYSDATE), v_create_partition_count_in))+1;
  
  --取值
  for utp in cur_utp(v_table_name_in) loop
    v_high_value := substr(utp.high_value,11,10);
    v_partition_max_date := to_date(v_high_value,'YYYY-MM-DD');
    
    dbms_output.put_line('v_high_value:' || v_high_value);

    --如果没有给默认值
    if (v_tablespace_name_in is null) then
      v_tablespace_name := utp.tablespace_name;
    else
      v_tablespace_name := v_tablespace_name_in;
    end if;
  end loop;

  i:= 0;
  v_partition_max_date := add_months(v_partition_max_date,v_interver);

 /************************************************************
  alter table Article_Detail split partition Article_Detail_Others at(TO_DATE('2014-01-01', 'yyyy-mm-dd'))
  into(
     partition Article_Detail_201401 LOB (CONTENT_HTML) store as SECUREFILE (TABLESPACE wm_article_detail_clob) tablespace WM_ARTICLE_DETAIL,
     partition Article_Detail_Others LOB (CONTENT_HTML) store as SECUREFILE (TABLESPACE wm_article_detail_clob) tablespace WM_ARTICLE_DETAIL
  );
 *************************************************************/

  while v_partition_max_date <= v_max_date_this_time loop
    v_SqlExec := 'ALTER TABLE ' || v_table_name_in || ' SPLIT PARTITION ' || v_split_partition_source_in || ' AT' ||
                 '(TO_DATE('''||to_char(v_partition_max_date, 'YYYY-MM-DD')||''',''YYYY-MM-DD'')) INTO(PARTITION '||                 
                 v_part_name_prifex_in || to_char(v_partition_max_date,'YYYYMM') || ' ' || v_field_tablespace_name_in ||
                 ' TABLESPACE '  || v_tablespace_name || ', PARTITION '||v_split_partition_source_in||')';
    dbms_output.put_line('Added Partition ' || i || '=' || v_SqlExec);
    DBMS_Utility.Exec_DDL_Statement(v_SqlExec);
    v_partition_max_date := add_months(v_partition_max_date,v_interver);
    i:= i + 1;
  end loop;

  v_count := v_count + i;
  dbms_output.put_line('Added Partition Count:' || v_count);
  
  commit;
Exception
  when OTHERS then
    --ReturnValue:=-1003;
    dbms_output.put_line('The SQLCode is: '||SQLCODE);
    dbms_output.put_line('The SQLERRM is: '||SQLERRM);

end SP_Split_Partition;

2. 创建调度分离分区的存储过程

CREATE OR REPLACE Procedure SP_Call_SP_Split_Partition is
begin
  
  update Article_Detail t set t.transfer_done_time=t.extracted_time where t.transfer_done_time is null;
  commit;
  
  dbms_stats.gather_table_stats('WDM_APP','ARTICLE_DETAIL',partname=>'ARTICLE_DETAIL_OTHERS');

  SP_Split_Partition(
  'ARTICLE_DETAIL',
  'ARTICLE_DETAIL_',
  'ARTICLE_DETAIL_OTHERS',
  'WM_ARTICLE_DETAIL',
  'LOB (CONTENT_HTML) store as SECUREFILE (TABLESPACE wm_article_detail_clob)',
  3
  );

  SP_Split_Partition(
  'ARTICLE_DATA',
  'ARTICLE_DATA_',
  'ARTICLE_DATA_OTHERS',
  'WM_ARTICLE_DATA',
  '',
  3
  );

Exception
  when OTHERS then
    --ReturnValue:=-1003;
    dbms_output.put_line('The SQLCode is: '||SQLCODE);
    dbms_output.put_line('The SQLERRM is: '||SQLERRM);

end SP_Call_SP_Split_Partition;

3. 创建相应的JOB, 并执行.

CREATE OR REPLACE PROCEDURE Job_SP_Call_SP_Split_Partition AS
 JobNo user_jobs.job%TYPE;
BEGIN
  begin
     dbms_job.submit(JobNo, 'begin SP_Call_SP_Split_Partition; end;',
     SYSDATE+1/1440,'TRUNC(SYSDATE+15)');
     COMMIT;
  end;
END;
/

call Job_SP_Call_SP_Split_Partition();

转载于:https://www.cnblogs.com/krisy/p/3481827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值