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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM