对分区表批量添加分区的案例

分区表对分区操作的基本语句如下:


#增加Range表分区
alter table t_partition_range  add partition p5 values less than (TO_DATE('2017-10-01', 'yyyy-mm-dd'));
#修改Range表分区
alter table t_partition_range  modifypartition p5 values less than (TO_DATE('2017-08-01', 'yyyy-mm-dd'));
#删除Range表分区
alter table t_partition_range  drop partition p_5;

 

但是我们再工作中不可能一个表一个表的操作,就算你真的有这个毅力,过几个月,又要加分区了,你还要再来一遍吗 ?对于这种繁复的操作,我目前采用的方法是 直接写一个存储过程,等到要加的时候,只要输入参数(日期),需要添加分区的表,全部自动创建对应参数的日期。

看一个例子:

反洗钱项目又193张分区表,上个负责的同事跑路了,没有交接,现在我需要对193张分区表,按照天,加1个月的分区。

我肯定不可能一个一个的写,就算我这次写了,下个月我还要再加一遍,疯了 。如上分所说,我准备写一个存储过程。如下:

CREATE OR REPLACE PROCEDURE pro_alter_aml_boot( V_BUSS_DATE IN VARCHAR2,      --分区日期
                                                                                                   O_CODE OUT VARCHAR2,           --返回分区日期+1
                                                                                                   O_MESSAGE OUT VARCHAR2 )       --返回拼接语句
IS


/**********************************************************************************
*功     能  :给反洗钱的表增加分区
*业务范围   :
*作    者   :
*创建日期   :2010-07-25
*修 改 人   :
*修改日期   :
*修改批次   :
***********************************************************************************/

     BUSS_DATE VARCHAR2(40);--用来接收传入日期
      V_TEMPDATE       VARCHAR2(1024);--接收日期+1
       V_STRSQL         VARCHAR2(1024);--用来接收拼接的alter语句

BEGIN
    BUSS_DATE := V_BUSS_DATE;
    
    --传入日期加1
      select to_char(to_date(BUSS_DATE,'yyyy-mm-dd hh24:mi:ss')+1,'yyyy-mm-dd hh24:mi:ss') into V_TEMPDATE from dual;
    --  dbms_output.put_line(V_TEMPDATE);--输出打印 
    O_CODE := V_TEMPDATE;--输出查看
    
    --循环遍历aml全量表,获取194张表名 这里很关键 不要使用DBA的表 权限不足 无法获取,使用user下的表可以
    FOR DJ IN (select  a.table_name from tybs.aml_sum a 
             ORDER BY a.table_name) LOOP
                      
     V_STRSQL := 'ALTER TABLE '|| DJ.table_name ||' ADD PARTITION PT_' ||BUSS_DATE ||'
      values less than (to_date('''||V_TEMPDATE||''','||'''yyyy-mm-dd hh24:mi:ss'''||')) /*tablespace TBS_YW_DATA*/';


     O_MESSAGE := V_STRSQL;
      EXECUTE IMMEDIATE V_STRSQL;
              
    END LOOP;
    
    --不要忘记循环,入参,变量等地方的分号
    --拼接时候不要忘记空格 拼接的语句下面一定要输出看看 否则很难调试

  
EXCEPTION
    WHEN OTHERS THEN
    ROLLBACK;
    O_CODE := 'ORA'||SQLCODE;
    O_MESSAGE := '[ERROR]:'||SUBSTR( SQLERRM, 1, 290 );
    --Exception Log Record
    RAISE;

END pro_alter_aml_boot;   

好了 ,写完这个以后 我只要输入一个要创建的分区日期,193张就自动完成。搞定

 

再分享一个自动创建分区的办法:

就是再创建表的时候,让ORACLE 自动创建,以后都交给ORACLE 自动管理 ,但是对于已经存在的表,那只能删除重建了。create table TYBS.EAST_DATA_ASLB_2
(
  corpcode VARCHAR2(32 CHAR) not null,
  fsssno   VARCHAR2(30 CHAR),
  filino   VARCHAR2(30 CHAR),
  brchno   VARCHAR2(30 CHAR) not null,
  itemcd   VARCHAR2(20 CHAR) not null,
  itemna   VARCHAR2(60 CHAR),
  itembl   NUMBER(22,2),
  trandt   DATE not null,
  crcycd   VARCHAR2(3 CHAR) not null,
  areana   VARCHAR2(60 CHAR),
  areacd   VARCHAR2(64 CHAR),
  reptdt   DATE not null,
  geldtp   VARCHAR2(12 CHAR)
)
tablespace TBS_TYBS_DATA
partition by range(reptdt) interval(numtodsinterval(1,'month'))
(
PARTITION p_1 values less than (to_date('2018-01-01','yyyy-mm-dd')) 
tablespace TBS_TYBS_DATA
);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值