当前位置:   article > 正文

oracle添加分区语句_oracle增加分区的方法

oracle增加分区语句

在项目中经常要增加大量的分区,总结了增加分区的方法:

1.如果只增加一级分区,没有子分区,可以简单的用如下语句增加:

alter table TDW_12580_ORD_REL_TAB_M

add PARTITION M_TDW_12580_201005 VALUES (201005)

[@more@]

2.如果增加的分区有子分区,则需要先建一个一级分区和子分区,然后用下面的脚本来增加:

注意:表名用大写,日期格式为20100801 结束日期为下一个月的1号,如20100901

脚本:

declare

--初始化参数

v_table_name varchar2(30);

v_partition_name varchar2(30);

v_subpartition_name varchar2(30);

v_segment_type varchar2(30);

v_begin_date_str varchar2(10);

v_sql varchar2(1000);

v_begin_date date;

v_end_date date;

--查找出所有分区表

cursor C_table_name is

select t1.table_name

from user_tables t1

where t1.table_name in ('&TABLE_NAME');

begin

open C_table_name;

loop

fetch C_table_name

into v_table_name;

exit when C_table_name%notfound;

--查找出分区表的类型

select distinct (t2.segment_type)

into v_segment_type

from user_segments t2

where t2.segment_name = v_table_name;

if v_segment_type in ('TABLE SUBPARTITION') then

--取出分区和子分区表名的不含日期部分

select distinct substr(t3.partition_name,

0,

length(t3.partition_name) - 6),

substr(t3.subpartition_name,

0,

length(t3.subpartition_name) - 8)

into v_partition_name, v_subpartition_name

from user_tab_subpartitions t3

where t3.table_name = v_table_name;

--初始化日期

v_begin_date := to_date('&START_DATE', 'YYYYMMDD');

v_end_date := to_date('&END_DATE', 'YYYYMMDD');

--循环创建2010年的表分区

while v_begin_date < v_end_date loop

--创建增加分区语句,如:alter table v_table_name add partition v_partition_nameYYYYMM values (YYYYMM) (subpartition v_subpartition_nameYYYYMMDD values (YYYYMMDD));

v_begin_date_str := substr(to_char(v_begin_date, 'YYYYMMDD'), 7, 2);

if v_begin_date_str in ('01') then

v_sql := 'alter table ' || v_table_name || ' add partition ' ||

v_partition_name ||

substr(to_char(v_begin_date, 'YYYYMMDD'), 0, 6) ||

' values (' ||

substr(to_char(v_begin_date, 'YYYYMMDD'), 0, 6) ||

') (subpartition ' || v_subpartition_name ||

to_char(v_begin_date, 'YYYYMMDD') || ' values (' ||

to_char(v_begin_date, 'YYYYMMDD') || '))';

else

v_sql := 'alter table ' || v_table_name || ' modify partition ' ||

v_partition_name ||

substr(to_char(v_begin_date, 'YYYYMMDD'), 0, 6) ||

' add subpartition ' || v_subpartition_name ||

to_char(v_begin_date, 'YYYYMMDD') || ' values (' ||

to_char(v_begin_date, 'YYYYMMDD') || ')';

end if;

--显示增加分区语句

--DBMS_OUTPUT.put_line(v_sql);

--执行增加分区语句

execute immediate v_sql;

--日期加一天

v_begin_date := v_begin_date + 1;

end loop;

elsif v_segment_type in ('TABLE PARTITION') then

--取出分区表名的不含日期部分

select distinct (substr(t4.partition_name,

0,

length(t4.partition_name) - 6))

into v_partition_name

from user_tab_partitions t4

where t4.table_name = v_table_name;

--初始化日期

v_begin_date := to_date('&START_DATE', 'YYYYMMDD');

v_end_date := to_date('&START_DATE', 'YYYYMMDD');

--循环创建2010年的表分区

while v_begin_date < v_end_date loop

--创建增加分区语句,如:alter table v_table_name add partition v_partition_nameYYYYMM values (YYYYMM);

v_sql := 'alter table ' || v_table_name || ' add partition ' ||

v_partition_name ||

substr(to_char(v_begin_date, 'YYYYMMDD'), 0, 6) ||

' values (' ||

substr(to_char(v_begin_date, 'YYYYMMDD'), 0, 6) || ')';

--显示增加分区语句

--- DBMS_OUTPUT.put_line(v_sql);

--执行增加分区语句

execute immediate v_sql;

--日期加一月

v_begin_date := add_months(v_begin_date, 1);

end loop;

else

DBMS_OUTPUT.put_line(v_table_name || '表类型为' || v_segment_type ||

',请查看!');

end if;

end loop;

close C_table_name;

end;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/273224
推荐阅读
相关标签
  

闽ICP备14008679号