給Oracle 11g Interval分區(qū)進(jìn)行重命名 |
發(fā)布時(shí)間: 2012/9/17 17:25:19 |
Oracle 11g 眾多新特性中,我最喜歡的就是分區(qū)表增強(qiáng),眾所周知很多大問題“化整為零”之后就不是個(gè)問題,分區(qū)表就是一種非常好用的“化整為零”的手段。 1 CREATE TABLE Partition_Table 2 ( 3 .... 4 .... 5 .... 6 ) 7 PARTITION BY RANGE( MSGDATE ) INTERVAL( NUMTOYMINTERVAL(1,'MONTH') ) 8 SUBPARTITION BY LIST( DAY_V ) 分區(qū)和子分區(qū)的重命名語法如下: 2 alter table <table_name> rename subpartition <subpartition_name> to <new_subpartition_name>; 每當(dāng)新數(shù)據(jù)觸發(fā)新建分區(qū)后,分區(qū)名字是系統(tǒng)給的,雖然不影響分區(qū)表的使用,但是看著很讓人迷茫: 2 table_name , 3 partition_name, 4 subpartition_name , 5 tablespace_name 6 from user_tab_subpartitions 7 where subpartition_name like 'SYS%' ; 02 ------------------------------ --------------- ------------------ ------------------------------ 03 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP100 FIREWALL16 04 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP101 FIREWALL17 05 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP102 FIREWALL18 06 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP103 FIREWALL19 07 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP104 FIREWALL20 08 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP105 FIREWALL21 09 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP106 FIREWALL22 10 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP107 FIREWALL23 11 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP108 FIREWALL24 12 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP109 FIREWALL25 13 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP110 FIREWALL26 14 15 TABLE_NAME PARTITION_NAME SUBPARTITION_NAME TABLESPACE_NAME 16 ------------------------------ --------------- ------------------ ------------------------------ 17 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP111 FIREWALL27 18 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP112 FIREWALL28 19 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP113 FIREWALL29 20 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP114 FIREWALL30 21 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP115 FIREWALL31 22 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP85 FIREWALL01 23 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP86 FIREWALL02 24 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP87 FIREWALL03 25 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP88 FIREWALL04 26 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP89 FIREWALL05 27 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP90 FIREWALL06 28 29 TABLE_NAME PARTITION_NAME SUBPARTITION_NAME TABLESPACE_NAME 30 ------------------------------ --------------- ------------------ ------------------------------ 31 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP91 FIREWALL07 32 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP92 FIREWALL08 33 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP93 FIREWALL09 34 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP94 FIREWALL10 35 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP95 FIREWALL11 36 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP96 FIREWALL12 37 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP97 FIREWALL13 38 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP98 FIREWALL14 39 P_MYSYSLOG_IL_2010 SYS_P116 SYS_SUBP99 FIREWALL15 將分區(qū)/子分區(qū)的名字改成得有意義才是王道。以下是用一個(gè)過程配合游標(biāo)來改分區(qū)名,重點(diǎn)是是從high_value字段獲得該分區(qū)的范圍描述,其他沒什么了: 02 v_sql varchar(400); 03 v_table_name user_tab_partitions.table_name%type; 04 v_partition_name user_tab_partitions.partition_name%type; 05 v_high_value varchar(200); 06 v_tmp_partition_name user_tab_partitions.partition_name%type; 07 cursor cur is 08 select 09 table_name , 10 partition_name , 11 high_value 12 from user_tab_partitions 13 where partition_name like 'SYS%' ; 14 begin 15 open cur; 16 loop 17 fetch cur into v_table_name,v_partition_name,v_high_value; 18 exit when cur%notfound; 19 v_tmp_partition_name := substr(v_high_value,11,10); 20 v_tmp_partition_name := to_char( to_date(v_tmp_partition_name,'yyyy-mm-dd')-1 , 'yyyymm'); 21 v_sql := 'alter table '||v_table_name||' rename partition ' 22 ||v_partition_name 23 ||' to P'||v_tmp_partition_name; 24 dbms_output.put_line( v_sql ); 25 execute immediate v_sql; 26 end loop; 27 close cur; 28 end; 29 / 由于改分區(qū)名屬于DDL語句,對(duì)于忙碌的系統(tǒng)來說很容易遇到ORA-00054這個(gè)錯(cuò)誤: Oracle 11g 同時(shí)也引入了一個(gè)新特性——DDL Wait ,以前遇到這種情況要不就是找出那個(gè)該死的Transaction kill掉,要不就雇個(gè)人拼命堅(jiān)持不懈地敲鍵盤跑這條DDL,直到成功執(zhí)行,現(xiàn)在好了,這個(gè)人可以下崗了。只要設(shè)定ddl_lock_timeout這個(gè)參數(shù)就可以了,這個(gè)參數(shù)可以在實(shí)例級(jí)別和會(huì)話級(jí)別上設(shè)置,如果該值為0,遇到未提交事務(wù)時(shí)就會(huì)馬上報(bào)ORA-00054,如果設(shè)定為10,DDL語句會(huì)為這個(gè)事務(wù)最多等10秒,10秒內(nèi)事務(wù)提交,DDL語句就會(huì)執(zhí)行成功,否則10秒后再報(bào)ORA-00054。
本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |