实际工作中,单个表里往往存有非常多的数据(千万级以上),此时应该对表进行分区,而且常常采取每日一个分区,如果创表时手动设置分区,以天划分的话要分成几百上千个,手动不太现实。因此只能用存储过程实现。
实现案例
首先创建一个测试表,设置为范围分区,先创建一个分区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';
目前表里只有一个分区。
编写存储过程
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:输入最后一个分区的时间(字符串)
调用存储过程
打开命令行窗口,输入参数调用存储过程
再次查询表内分区情况