Oralce动态的创建按月的分区

Posted dalianpai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 +1YYYYMM);

       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;

 

以上是关于Oralce动态的创建按月的分区的主要内容,如果未能解决你的问题,请参考以下文章

如何使用SQLServer数据库按月创建表分区

PowerBI DAX计算:按月的移动平均线组计算

sqlserver 如何按年按月创建分区函数

传入时间按月分区并创建每月表空间

Android studio 动态片段根据日期

获取按月分组的最近 12 个月的数据,即使为 0