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。