oracle call 存储过程 带out_Oracle存储过程实现批量表分区

eab8f8a78930be950aaac7f2638ba230.png

实际工作中,单个表里往往存有非常多的数据(千万级以上),此时应该对表进行分区,而且常常采取每日一个分区,如果创表时手动设置分区,以天划分的话要分成几百上千个,手动不太现实。因此只能用存储过程实现。

实现案例

首先创建一个测试表,设置为范围分区,先创建一个分区2020-01-01

create table test_par(
par_id varchar2(50),
hire_date date)
partition by range(hire_date)
(partition p20200101 values less than (to_date('2020-01-01','yyyy/mm/dd')));

查看表的分区情况

select table_name,partition_name from user_tab_partitions where table_name='TEST_PAR';

82b1a3a4b02dcbd76724514ff85a9380.png

目前表里只有一个分区。

编写存储过程

CREATE OR REPLACE PROCEDURE AUTO_PARTITION(
TABLE_NAME IN VARCHAR2,START_DATE IN varchar2,END_DATE IN varchar2)
IS
S_DATE DATE:=to_date(START_DATE,'yyyy-mm-dd');
E_DATE DATE:=to_date(END_DATE,'yyyy-mm-dd');
V_TABLE_NAME VARCHAR(20):=TABLE_NAME;
V_SQL VARCHAR2(500);
V_PNAME VARCHAR2(20);

BEGIN
V_PNAME := 'P'||START_DATE;
WHILE S_DATE < E_DATE
  LOOP
      V_SQL:= 'ALTER TABLE '||V_TABLE_NAME||' ADD PARTITION '||V_PNAME||' VALUES LESS THAN ( date'''||to_char(s_date,'yyyy-mm-dd')||''')';
      DBMS_OUTPUT.PUT_LINE(V_SQL);
      EXECUTE IMMEDIATE V_SQL;
      COMMIT;
      S_DATE:=S_DATE+1;
      V_PNAME:='P'||TO_CHAR(TO_DATE(SUBSTR(V_PNAME,2,8),'yyyymmdd')+1,'yyyymmdd');
  END LOOP;
END;

解释说明

这个存储过程自带3个变量

  • table_name: 输入要分区的表名
  • star_date :输入新增分区的起始时间(字符串)
  • end_date:输入最后一个分区的时间(字符串)

调用存储过程

打开命令行窗口,输入参数调用存储过程

de13ff09eb60bd099ae7d9ab18447473.png

再次查询表内分区情况

4cbabd578407ad67a04aafedaf6e1e34.png

成功批量分区

b363727fb8d8b2f27f2fcfaa9440af55.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值