oracle增加分割槽的方法

guyuanli發表於2010-10-12

在專案中經常要增加大量的分割槽,總結了增加分割槽的方法:

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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7490392/viewspace-1039636/,如需轉載,請註明出處,否則將追究法律責任。

相關文章