1 CREATE OR REPLACE PROCEDURE PRO_DEL_ADD_PARTITION 2 AS 3 /*************************************************** 4 ** 功能:按日添加本月的分区 5 ** 创建者:sfit1053 6 ** 创建时间:20150825 7 ****************************************************/ 8 l_from_date DATE; -- 存放循环起始日期(当月的第一天) 9 l_to_date DATE; -- 存放循环截止日期(下月的第一天) 10 l_partition VARCHAR2(30); -- 表分区名 11 l_p_exist NUMBER(18,0); -- 判断表分区是否已经存在 12 l_sql1 VARCHAR2(200); -- 存放将要执行的SQL语句 13 l_sql2 VARCHAR2(1000); -- 存放将要执行的SQL语句 14 l_sql3 VARCHAR2(200); -- 存放将要执行的SQL语句 15 RET_MSG VARCHAR2(300); --执行出错错误信息 16 17 BEGIN 18 19 l_from_date := TRUNC(sysdate,'MM'); 20 l_to_date := ADD_MONTHS(l_from_date,1); 21 22 WHILE l_from_date< l_to_date LOOP 23 l_partition := 'D'||TO_CHAR(l_from_date,'YYYYMMDD'); 24 SELECT NVL(COUNT(1),0) INTO l_p_exist 25 FROM USER_TAB_PARTITIONS 26 WHERE table_name='UCMP_PUSH_MESSAGE' 27 AND partition_name=l_partition; 28 29 IF l_p_exist=0 THEN 30 l_sql1 := 'ALTER TABLE UCMP_PUSH_MESSAGE_BAK ADD PARTITION "'||l_partition||'" VALUES LESS THAN (to_date('''||TO_CHAR(l_from_date,'YYYY-MM-DD')||''','''||'yyyy-mm-dd'||'''))'; 31 l_sql3 := 'ALTER TABLE UCMP_PUSH_MESSAGE ADD PARTITION "'||l_partition||'" VALUES LESS THAN (to_date('''||TO_CHAR(l_from_date,'YYYY-MM-DD')||''','''||'yyyy-mm-dd'||'''))'; 32 EXECUTE IMMEDIATE l_sql1; 33 EXECUTE IMMEDIATE l_sql3; 34 END IF; 35 l_from_date := l_from_date+1; 36 END LOOP; 37 RET_MSG :='OK'; 38 EXCEPTION WHEN OTHERS THEN 39 BEGIN 40 RET_MSG := '存储过程PRO_DEL_ADD_PARTITION执行错误!' || CHR(10) || 41 '错误代码:' || SQLCODE || CHR(10) || '错误信息:' || 42 SUBSTR(SQLERRM, 1, 128); 43 END; 44 l_sql2:='insert into ucmp_cl_script_log(pro_name,log_time,log_des) values(''PRO_DEL_ADD_PARTITION'',sysdate,'''||RET_MSG||''')'; 45 EXECUTE IMMEDIATE l_sql2; 46 COMMIT; 47 END PRO_DEL_ADD_PARTITION;