Oralce动态的创建按月的分区

说明:

XXX为一个配置表,里面配置了要分区的表明,即CODENO = 'PARTITIONTABLENAME',只有每个月月底的时候,
才会进入IF的判断,此外还有一个定时任务,每天去执行即可。

存储过程:

 CREATE OR REPLACE PROCEDURE  ETL_CREATE_TABLE_PARTITION(ParaDate Date) IS
 V_RUNID VARCHAR2(32) :=PKG_UTILS.F_GET_RUNID();
 V_PROCDESC VARCHAR2(64) :='ETL 表分区的建立';
 V_SQL VARCHAR2(2000);
 V_COUNT  INTEGER;
 CURSOR C_PARTTABNAME IS SELECT ITEMNO AS TABNAME FROM XXX WHERE CODENO = 'PARTITIONTABLENAME' AND ISINUSE='1';
 
 /* 1.从XXX 中找出所有需要建立新分区的表名(游标)
    2.如果今天是月末,那么动态拼接建立下个月的表分区的SQL语句,直接运行
     -- 由于有MAXVALUE的存在,不能直接add partition,而是需要MAX分区split
     */
BEGIN
   
    PKG_UTILS.LOG('BEGIN',V_RUNID,V_PROCDESC,'ETL开始...');
    
    IF TO_CHAR(PARTITION,'YYYYMM') <> TO_CHAR(PARADATE +1,'YYYYMM') THEN     
    FOR C --可以不定义 
      IN C_PARTTABNAME LOOP
      --查看此表新的分区是否存在
      SELECT COUNT(*)
        INTO V_COUNT
        FROM USER_TAB_PARTITIONS
      WHERE TABLE_NAME = C.TABNAME
     AND PARTITION_NAME = 'P_'|| TO_CHAR(PARADATE +1'YYYYMM');

       IF V_COUNT = 0 THEN
       
         -- 建立新分区
        V_SQL := 'ALTER TABLE '|| C.TABNAME
         || 'SPLIT PARTITION P_MAX '
         || 'AT(TO_DATE(''' || TO_CHAR(ADD_MONTHS(PARADATE+11),'YYYY/MM/DD') || ''',''YYYY/MM/DD'')) '
         || ' INTO (PARTITION P_' || TO_CHAR(ADD_MONTHS(PARADATE,1),'YYYY/MM/DD') || ''',''YYYY/MM/DD'') ';
          --其中一个表分区没有建立成功的话,下个还是要建立的
          BEGIN       
            EXECUTE IMMEDIATE V_SQL;
            EXCEPTION 
            WHEN OTHERS THEN NULL;
          END;
        END IF;
      END LOOP;
      END IF;
      PKG_UTILS.LOG('END',V_RUNID,V_PROCDESC ,'ETL结束....');
      EXCEPTION WHEN OTHERS THEN
      PKG_UTILS.LOG('ERROR',V_PROCDESC,SQLERRM,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END;

 

posted @ 2019-11-14 23:16  天宇轩-王  阅读(421)  评论(0编辑  收藏  举报