当前位置:Gxlcms > 数据库问题 > DB2分区表删除和添加分区

DB2分区表删除和添加分区

时间:2021-07-01 10:21:17 帮助过:15人阅读

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。

 

DB2分区表删除和添加分区

标签:

人气教程排行