设为首页 收藏本站
查看: 699|回复: 0

[经验分享] oracle月分区自动增长

[复制链接]

尚未签到

发表于 2016-7-21 08:49:14 | 显示全部楼层 |阅读模式
CREATE OR REPLACE PROCEDURE PRC_ADD_PARTITION_MON
IS
--/************************************************************************************
-- 程序名称:    PRC_ADD_PARTITION_MON
-- 功能描述:    增加表月分区存储过程   -- 期达目的:    将此程序挂起  每月1自动在最大表分区上面加1个月 无需人为来操作
-- 注意:       表分区里面切忌不要出现2个表空间 不然这个会有问题
-- 输入参数:    'YYYYMM' - <作业的处理日期>
-- 输出参数:    0 - <0为正常结束,其余为异常>
-- 输入资源:
-- 输出资源:
-- 中间资源:    <用户名>.<中间表或视图等对象名>
-- 创建人员:    XXXX
-- 创建日期:    20120725
-- 版本说明:    V1.0
-- 修改人员:    (针对程序的任何修改都需要记录修改人员)
-- 修改日期:    (针对程序的任何修改都需要记录修改日期)
-- 修改原因:    (针对程序的任何修改都需要记录修改原因,如果多次修改需依次记录)
-- 版本说明:
-- 执行说明:
-- 公司名称:   
--/************************************************************************************
--执行MM月的数据,输入的日期参数为YYYY(MM+1)DD,如'20091201'则是执行11月份的数据。
-- 编写规则说明
-- 说明1:所有自定义变量均用小写,并以v_打头;所有字段名均用大写
-- 说明2: 所有关键值均用大字;模式名、表名、函数名、存储过程名均用大写
-- 说明3: 缩进同其它程序,里面的逻辑体比外面的逻辑体向有缩进一个TAB键。
--        对齐主要是针对SQL语句,采用关键字换行和右对齐的方式(如果不方便也可使用左对齐。
-- 说明4: SQL语句目标和源要齐整
-- 说明5: 对每个表的数据作改变后都要显示的提交
v_sql       VARCHAR2(10000) DEFAULT ''; -- 动态SQL变量,注意SQL长度
v_prc       VARCHAR2(40);
v_date      VARCHAR2(8);
v_stepnum   NUMBER          DEFAULT 0;           -- 运行步骤
v_errmsg    VARCHAR2(1024)  DEFAULT '正常';
TYPE V_CURTYPE IS REF CURSOR;
v_open_cur  V_CURTYPE;  -- 定义游标 循环迭代
v_table_name VARCHAR2(40); -- 表名
v_table_owner VARCHAR2(40); -- 用户名
v_max_part_mon VARCHAR2(40); -- 已经存在在系统里面的最大月份值
v_tablespace_name VARCHAR2(40); -- 这个表分区的表空间
v_max_next_mon VARCHAR2(40); -- 要拓展的表分区的月份
v_max_next2_mon VARCHAR2(40);-- 要拓展的表分区的月份的下一个月
BEGIN
v_prc:='PRC_ADD_PARTITION_MON';
SELECT to_char(SYSDATE,'yyyymmdd') INTO v_date FROM  dual;
--正文SQL处理
--参考思路
--先把表,表用户,表分区最大值,表分区所在表空间拿出来
--循环迭代  取出这些表的月份的下一个月份值
--取到下一个月的值 添加表分区
-- 1 拿出需要拓展月分区的表的相关信息
OPEN v_open_cur FOR
'SELECT TABLE_NAME,TABLE_OWNER,MAX(SUBSTR(PARTITION_NAME,2,6)),TABLESPACE_NAME FROM ALL_TAB_PARTITIONS
WHERE TABLE_OWNER=''JXZZJY''
--AND TABLE_NAME LIKE ''MD%''
AND LENGTH(RTRIM(PARTITION_NAME))=7
GROUP BY TABLE_NAME,TABLE_OWNER,TABLESPACE_NAME';
-- 开始把值赋给变量 准备循环迭代了
LOOP
FETCH v_open_cur INTO v_table_name,v_table_owner,v_max_part_mon,v_tablespace_name;
EXIT WHEN v_open_cur%NOTFOUND;
-- 把循环里面的最大月份加1 作为下一个月 为开始拓展表分区做好准备
SELECT TO_CHAR(ADD_MONTHS(TO_DATE(v_max_part_mon,'YYYYMM'),1),'YYYYMM') INTO v_max_next_mon FROM DUAL;
SELECT TO_CHAR(ADD_MONTHS(TO_DATE(v_max_part_mon,'YYYYMM'),2),'YYYYMM') INTO v_max_next2_mon FROM DUAL;
-- 开始拓展表空间
v_stepnum :=v_stepnum+1;
v_sql:= 'ALTER TABLE '||v_table_owner||'.'||v_table_name||' ADD PARTITION P'||v_max_next_mon||' VALUES LESS THAN ('''||v_max_next2_mon||''') TABLESPACE '||v_tablespace_name||' ';
EXECUTE IMMEDIATE v_sql;
PRC_LOG_WRT(v_date,v_prc,v_stepnum,v_sql,v_errmsg,SQL%ROWCOUNT);
COMMIT;
END LOOP;
CLOSE v_open_cur;

-- 存储过程错误信息记录
EXCEPTION
WHEN OTHERS THEN
v_errmsg := v_stepnum || '步出错:' || SQLERRM;
PRC_LOG_WRT(v_date,v_prc,v_stepnum,v_sql,v_errmsg,-1);
COMMIT;
END;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-247134-1-1.html 上篇帖子: Oracle事物中的savepoint 下篇帖子: [简单]oracle替换sql中的&
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表