DB2分區表刪除和添加分區


1.數據庫版本

2.具體procedure

DROP PROCEDURE DB2USER.TOOLS_PARTITION_TABLE_SHOW (VARCHAR ());

CREATE OR REPLACE PROCEDURE Tools_partition_table_show(IN ETL_DATE VARCHAR(8))
  /******************************************************************************
     NAME:
     PURPOSE:
  
     REVISIONS:
     Ver        Date        Author        Description
     ---------  ----------  ------------  ------------------------------------
     1.0        2015-07-22  Zen        1. 作為分區表添加和快速刪除分區的一個示例
                                           供有相同需求的腳本參考。
  ******************************************************************************/
  LANGUAGE SQL
BEGIN
  DECLARE V_LOCATION VARCHAR(100);
  DECLARE V_START_TIME TIMESTAMP;
  DECLARE V_SQLMSG VARCHAR(255);
  DECLARE V_CNT INT;
  DECLARE V_PARTITION_NAME VARCHAR(50);
  DECLARE V_PARTITION_END VARCHAR(50);
  DECLARE EXIT HANDLER FOR SQLEXCEPTION                                                                                        
   BEGIN                                                                                                                     
      GET DIAGNOSTICS EXCEPTION 1 V_SQLMSG = MESSAGE_TEXT;                                                                      
      CALL DB2USER.PRO_LOG(ETL_DATE,'Tools_partition_table_show','測試分區表作業方式',V_START_TIME,current timestamp,'ERROR',V_LOCATION,V_SQLMSG);                                                                            
  END;
  /*清空目標表*/ 
  SET V_START_TIME = current timestamp;
  SET V_LOCATION = '清空數據';
  
  /*
  DELETE FROM DB2USER.S_CLM_RATE_POL_AAA WHERE BBQ = SUBSTR(ETL_DATE,1,6);
  
  COMMIT;*/
  SET V_LOCATION = '測試保單賠率表的抽取開始';
  SET V_PARTITION_NAME = 'P'||SUBSTR(ETL_DATE,1,6);
  SET V_PARTITION_END = TO_CHAR(add_months(TO_DATE(ETL_DATE,'YYYYMMDD'),1),'YYYYMM');
  
  --SELECT TO_CHAR(add_months(TO_DATE(ETL_DATE,'YYYYMMDD'),1),'YYYYMM') INTO V_PARTITION_END FROM sysibm.dual;
  
  --判斷分區是否存在,如果存在,數據轉出刪除
  SELECT COUNT(*) INTO V_CNT FROM syscat.datapartitions t 
    WHERE tabschema='DB2USER' 
    AND tabname='S_CLM_RATE_POL_AAA_TEST'
    AND datapartitionname=V_PARTITION_NAME ;
  
  IF V_CNT=1 THEN     
      -- 分區數據轉出
      EXECUTE IMMEDIATE 'ALTER TABLE S_CLM_RATE_POL_AAA_test DETACH PARTITION '||V_PARTITION_NAME||' INTO DB2USER.TEMP_S_CLM_RATE_POL_AAA';
      COMMIT;
      EXECUTE IMMEDIATE 'DROP TABLE DB2USER.TEMP_S_CLM_RATE_POL_AAA';
  END IF ;
  
  SET V_LOCATION = 'after 分區數據轉出';
  
  --非正常DML或DDL 需要調用 sysproc.admin_cmd();
  --收集統計信息
  CALL SYSPROC.ADMIN_CMD('RUNSTATS ON TABLE db2user.S_CLM_RATE_POL_AAA_test');
  
  -- 添加新分區
  EXECUTE IMMEDIATE 'ALTER  TABLE  DB2USER.S_CLM_RATE_POL_AAA_test ADD PARTITION '||V_PARTITION_NAME||' STARTING '||SUBSTR(ETL_DATE,1,6)||' INCLUSIVE ENDING '||V_PARTITION_END||' exclusive';
  
  SET V_LOCATION = 'after 添加新分區';
  COMMIT;
  
  EXECUTE IMMEDIATE 'ALTER TABLE DB2USER.S_CLM_RATE_POL_AAA_test ACTIVATE  NOT  LOGGED  INITIALLY';
  
  FOR REC AS WITH TMP(TYPE) AS (SELECT 'AAA1' AS TYPE FROM SYSIBM.DUAL
                          UNION ALL
                          SELECT 'AAA2' AS TYPE  FROM SYSIBM.DUAL
                          UNION ALL
                          SELECT 'AAA4' AS TYPE  FROM SYSIBM.DUAL)
               SELECT * FROM TMP
   DO
   SET V_LOCATION = 'test'||REC.TYPE;
   
   INSERT INTO DB2USER.S_CLM_RATE_POL_AAA_test
   SELECT
      ......END FOR;
   
  CALL DB2USER.PRO_LOG(ETL_DATE,'Tools_partition_table_show','測試分區表作業方式',V_START_TIME,current timestamp,'SUCCESS','','');
END;

3.總結:

a.db2 中表分區目前只支持range分區,沒有oracle的豐富。

b.分區不能直接刪除必須先 DETACH PARTITION ,detach之后必須commit不然會報結構不完善的錯誤。

c.需要添加新的分區只需要直接 ADD partition。

d.DDL語句用在procedure中需要顯示commit。

 


免責聲明!

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



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