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;