Oralce动态的创建按月的分区
创建 动态 分区 oralce
2023-09-11 14:16:50 时间
说明:
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+1,1),'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;
相关文章
- 创建线程的3种方式
- VS2019 创建C++动态库dll----C#调用
- Git 从commit id创建分支
- 创建型模式之多例模式
- Hive 根据表中某个字段动态分区 以及临时表创建
- 使用Visual Studio的动态连接库创建通用数据库连接对话框
- 一个简单的小技巧,监控网页所有动态标签创建的调用处
- 单身MM创建的广州易唯翻译有限公司(www.gzjoyway.com),嘿嘿。。。
- 阿里云Linux创建docker容器
- 【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 标签闭包下创建子标签 | 使用 MarkupBuilderHelper 添加 xml 注释 )
- Vue3+vite项目中如何动态导入并创建多个全局组件
- Redis源代码分析(二十八)--- object创建和释放redisObject物
- 创建一个动态Web项目:
- 通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。
- 建木(Jianmu)----迈出建木第一步创建项目分组