刚写的一个把表rename然后重建分区表的一个存储过程!
上一篇 / 下一篇 2007-07-09 00:00:00 / 个人分类:oracle
存储过程注视很详细了,不多说了
CREATE OR REPLACE PROCEDURE Altertabletopartition_Zxt(Tablename IN VARCHAR2,ITPUB个人空间r+cKg;gc
Midtablename IN VARCHAR2 DEFAULT '',ITPUB个人空间y6{da TUi
Partitioncolomn IN VARCHAR2,
nD+?2bfH0 Partitionstartstr IN VARCHAR2 DEFAULT '',
z B oGA.w0 Partitionendstr IN VARCHAR2 DEFAULT '',
h]&PIG-l-M0 Partitioncolomntype IN CHAR DEFAULT '1',ITPUB个人空间}k)~3z,inrH
Partitiontype IN CHAR DEFAULT '1',ITPUB个人空间E,Nw"UL^#Ceu
Parttablespace IN VARCHAR2 DEFAULT NULL,
)lX$z4wR0 Varstart IN VARCHAR2 DEFAULT '0',ITPUB个人空间.QD
n/~#nE:?:F
Varinceraseby IN NUMBER DEFAULT 1,
[b7I"_^8^\@0 Varend IN VARCHAR2 DEFAULT '',
1t8rmEGXi8f6H0 Dropmidtabornot IN CHAR DEFAULT '1'--,
&z dT
\$[}}0 --State OUT CHARITPUB个人空间F9t8Bhn#S@
m4V
) ISITPUB个人空间)_iJK*S,~K#I
Mymidtablename VARCHAR2(30); --中间表的名称ITPUB个人空间r]roUa4h6Op
Partitiondml VARCHAR2(32767); --分区的DML、最大长度ITPUB个人空间F8@pFf7_$f/rSZ
Mypartitiontype VARCHAR2(10); --分区类型ITPUB个人空间z
} B.F(}"nf
Partitiontypesql VARCHAR2(20); --分区DDL;
h)B/@cio0 Myvarstart VARCHAR2(30); --起始字段
1jY\&r*\R0 Myvarend VARCHAR2(30); --终止字段ITPUB个人空间%W;ppux
i INTEGER; --循环
*OIPh~g6t k~0 Uu INTEGER; --用以分200字节打印分区DDL;
"H[n:V'?(A*mM!r#l0 g INTEGER; --对于日期类型的分区字段,在首次循环,不增加递增模式,Varinceraseby*0=0;
s`es4F&X6[&DgL0 --在下次循环中再按照递增模式增加 Varinceraseby*1=VarincerasebyITPUB个人空间uP2JP4}
BEGINITPUB个人空间*rD\%Uz^*A
i := 0;ITPUB个人空间g.aV;C-vk%\]N
g := 0;
6cox,X'J4u|!X4f0 /*
F@#O!X8of0 --Z.X.T
;?lqfZH)J0 --20070129
P#B mM;r7Id%D;A0 Q:由于数据仓库开发过程中可能可能存在建表的时候没有考虑到分区,在以后的应用中会增加查询的负担和相应时间ITPUB个人空间;Q)g-b(KQ
^3?w
A:本过程把一个非分区表转换成分区表,只考虑在原表上的一层分区,不考虑subpartitionITPUB个人空间M1cl(F%}yf9S J
分区逻辑:本程序采用先rename 表,然后再按照中间表创建原始表,同时加上分区的属性ITPUB个人空间2fLj6q O l
对于LIST类型,只提供按照一个类型的分区,也就是说只能PARTITION ** VALUES ('CT')而不能PARTITION ** VALUES ('CT','RI'..)ITPUB个人空间9a#ngb\9c
过程是用于下列情况,1:表数据在修改时间没有变化,对于时时变化的表,建议用oracle的在线重定义来实现!
u7vd4`2hXE0 2:分区字段Varinceraseby有递增模式,如:2004、2005、2006
3Qw?f-kT3CZH/RG`0 3:新增对于字段内部有递增方式的,如GLFW01AA、GLFW02AA、在第5位和第6位上有递增模式,ITPUB个人空间Wx(lL~N*EA7N
需传partitionstartstr=>'GLFW';partitionendstr=>'AA'
:]-^K*P!o0 4:分区会删掉所有索引等ITPUB个人空间#rJ:g.\4G%~
Vy
5:如果表上有物化试图日志,则应先drop掉,否则汇报错!
P$][Sy5AB
~,bc0 Tablename :原tableNameITPUB个人空间Xe}&zzl'\pE
Midtablename :过程中间的表名,如果没有传Midtablename则用Tablename构造Midtablename
*C4|v!Hb{\+y0 Partitioncolomn :原表上分区的字段名称ITPUB个人空间 IliKJuv
partitionstartpoint :分区字段的分区起始位置,如列为GLFW01、GLFW02等则可以作为list的分区方式分区
8SH9e
j Aa~5hO0 partitionstartpoint为01、02在列中的起始位置ITPUB个人空间'p@ f1HU
Nj%h
Partitioncolomntype :要分区的字段类型,1--varchar2、2--number、3--char、4--date
E@&O U k
ic8B)g0 parttablespace :分区表空间,为空则为当前用户的表空间ITPUB个人空间-e |9RpUu~B
Partitiontype :分区类型1--Range、2--List、3--Hash
5xsMn[M0Q0 Varstart :分区字段(Partitioncolomn)的起始,对于hash则不需要传入,只要传入Varinceraseby(用来表示要分几个区)就行
G7k A|7h0 Varinceraseby :分区字段的增长方式,如:起始为2004年,以1增长则第二个分区就是2004+1=2005,对于hash方式则表示hash分区的个数ITPUB个人空间y&a g0J
P7PJ.pN+r
Varend :分区字段(Partitioncolomn)的终止,对于hash则不需要
2jSm(u)Np2t+Z:PM0 Dropmidtabornot :需不需要drop中间表1--需要、2不需要
q-z+a2SM*e0 --State :返回成功分区标志1--成功、2--不成功ITPUB个人空间t*yX0ia&P
--exampleITPUB个人空间zg#H'Rjq
1:
L2XH3Y0SG&_@L7WM$B4P0 execute altertabletopartition_zxt('f_fix_fixreport','f_fix_fixreport1','REPORTCODE','GLFW','','1','2','shuihu','1','1','17','2');
5BCaC,xw{0k
A0 2:
v&Hs?$uyE6h3X4g0 execute Altertabletopartition_Zxt('f_reg_levyauthinfo','','AUTHDATE','','','4','1','shuihu','20040101',1,'20070101','2');ITPUB个人空间Q
^O5L*Wz
Tablename IN VARCHAR(30) NOT NULL,
C-qg!nOr0 Midtablename IN VARCHAR(30) DEFAULT '',ITPUB个人空间,YcuS8vk*k |
Partitioncolomn IN VARCHAR2(30) NOT NULL,
A!o6`b
v0C0 partitionstartstr IN varchar2(30) default '',ITPUB个人空间
AD&o9[b$Tt[
partitionendstr IN varchar2(30) default '',ITPUB个人空间&e$Zk5p2uT
Partitioncolomntype IN CHAR(1) DEFAULT '1',ITPUB个人空间.ky.Pb rw"]2{*X
Partitiontype IN CHAR(1) DEFAULT '1',
1V7v Wm]%iV{0 Parttablespace IN VARCHAR(30) DEFAULT '0',ITPUB个人空间;RJs-{,MU
Varstart IN VARCHAR2(11) DEFAULT '',ITPUB个人空间GT0t$U
n,svCSO
Varinceraseby IN NUMBER DEFAULT 1,
.TFQ;j%t9`tC0 Varend IN VARCHAR2(11) DEFAULT '0',
cN6UyR0 Dropmidtabornot IN CHAR(1) DEFAULT '1',ITPUB个人空间0`vH/ut3eg6b
State OUT CHAR(1)ITPUB个人空间`Yn}!K
*/ITPUB个人空间9`}8rY8C0O1h
p
Dbms_Output.Put_Line('tablename=' || Tablename);
]|)Y$o3D!w0 Dbms_Output.Put_Line('Midtablename=' || Midtablename);
'k0L)@R7Y?;q0 Dbms_Output.Put_Line('Partitioncolomn=' || Partitioncolomn);
7o;p:L-~"X:s0 Dbms_Output.Put_Line('partitionstartstr=' || Partitionstartstr); --partitionendstr
(yL:w/F0Q0Z'a ym0 Dbms_Output.Put_Line('partitionendstr=' || Partitionendstr);
"gQ'CboW
F3OQ0 Dbms_Output.Put_Line('Partitioncolomntype=' || Partitioncolomntype);ITPUB个人空间Av#b|l)d@
Dbms_Output.Put_Line('Parttablespace=' || Parttablespace);
0gZ;`9?:[2g0 Dbms_Output.Put_Line('Partitiontype=' || Partitiontype);
*u3X"w.h(a{Yv0 Dbms_Output.Put_Line('Varinceraseby=' || Varinceraseby);
@c#w
B3T0 Dbms_Output.Put_Line('Varstart=' || Varstart);ITPUB个人空间1O`#HV}:CQ6c
Dbms_Output.Put_Line('Varend=' || Varend);ITPUB个人空间/j*M8W a%B$MVBG,b
Dbms_Output.Put_Line('Dropmidtabornot=' || Dropmidtabornot);
1]j/\X_Ws
N)m8Y0 --对数据数据的校验ITPUB个人空间S-p6P'Y4_c
--Tablename 、Partitioncolomn不能为空ITPUB个人空间2CW?UZH4d/V
IF (Tablename IS NULL OR Partitioncolomn IS NULL) THEN
aa?1Vr
n
d0 Dbms_Output.Put_Line('表名、分区字段名不能为空!');
_mBoD5S,Q'\0 GOTO Aa;ITPUB个人空间'a_#j8n}M,g]
END IF;ITPUB个人空间)Q+dL(L(d
--Tablename的长度--字段定义不能超过30位
yoe#Y}0 IF (Lengthb(Tablename) > 30 OR Lengthb(Midtablename) > 30 OR Lengthb(Partitioncolomn) > 30 OR Lengthb(Parttablespace) > 30) THENITPUB个人空间e\(\#HK~5M"R
Dbms_Output.Put_Line('字段名成太长!');
$Q4k$\ZF$}sbhv J(rv0 GOTO Aa;
+mQ(}hp2x\R-]0 END IF;ITPUB个人空间A,m+?q)Jw
--初始化各数值
&z C'Z6a7L1R$C0 IF (Partitiontype = '3') THENITPUB个人空间Y~2{,blo mX
--对于hash 分区,不能只指定1个分区(Varinceraseby=1)
o#[ f,Q"j#bQ0 IF (Varinceraseby = 1) THEN
(\K0E#Ww*r)g
]0 Dbms_Output.Put_Line('对于hash 分区,不能只指定1个分区!');ITPUB个人空间/_(\M"[ep\
nN
c
GOTO Aa;
"l7B*Ds+?&B0 ELSE
F"CKoL&X/Q^,S0 Myvarstart := 0;
(FdVPw,t'Fb&c0 Myvarend := Varinceraseby;
,Di F.A\/I0]R6W0 END IF;
"S.R}@^#SdD4X&rT2DF0 ELSE
+~2T}] lnZ0 Myvarstart := Varstart;
[ J6p"v/|#g"Q0 Myvarend := Varend;
LL:l:Lo
fm#M0 IF (Myvarstart = Myvarend) THEN
$U `/`U t$Tw0 Dbms_Output.Put_Line('指定一个分区没有意义!');
b,y8W _Q0 GOTO Aa;
S:tYv1|ww!v%P,j0 END IF;ITPUB个人空间U|xnv~xX6j
@
END IF;