DB2编程序技巧 (二)
1 DB2编程
5 C+ Z# D% i. N4 l8 p& J( E0 M1.1 建存储过程时Create后一定不要用TAB键 - ]# K4 F% p6 k$ O! w
create procedure e8 L% e1 u# K& ]5 I* z
的create后只能用空格,而不可用tab健,否则编译会通不过。 7 b! R$ M3 h" f* W
切记,切记。 1 A9 ~* m. ^( q: J
1 F$ |" t7 I/ M3 L h( c6 G! P1.2 使用临时表
4 f4 n* G5 t8 }3 j! S+ K( Y, c3 q. d$ a1 H5 q
要注意,临时表只能建在usertemporytablesspace上,如果database只有systemtemporytablespace是不能建临时表的。
2 } J T8 H! }8 E9 I9 e另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。 3 s3 d+ T1 u" ]! F
建临时表时最好加上withreplace选项,这样就可以不显示的drop临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。 z) g2 \* f0 n+ w7 ?2 N
1.3 从数据表中取指定前几条记录
1 m! q* F0 o, ^2 F4 Xselect*fromtb_market_codefetchfirst1rowsonly % T+ H) t0 N7 ]1 g+ o) n: e& _2 v, @
$ [! w* N) b% q但下面这种方式不允许
' W, x3 a1 e* X: p7 e: @5 qselectmarket_codeintov_market_code
1 V7 g4 a. n3 m" L4 x* _fromtb_market_codefetchfirst1rowsonly; 5 f1 J' k+ M) q; J9 M
! ~# J9 |# U( o4 a$ p
选第一条记录的字段到一个变量以以下方式代替
( p, ^ u2 g3 \6 @! ddeclarev_market_codechar(1); , A6 s8 W% t# C% _9 B" B0 ?5 V
declarecursor1cursorforselectmarket_codefromtb_market_code 6 g" l ^3 L/ Q% @6 F+ @7 x% N
fetchfirst1rowsonlyforupdate; . J: K, W4 I. B) I
opencursor1; 3 x3 o, y6 r7 e& l! U& U
fetchcursor1intov_market_code;
% \" @, H5 Q+ Xclosecursor1;
) u- M$ ^" D( f9 Y4 ~
4 m, X3 T1 r1 E9 I, t2 u7 a( M3 h1.4 游标的使用 4 n# W8 m/ V* ]& Q+ J, Q1 C
注意commit和rollback , l5 P5 W' E; G) @
使用游标时要特别注意如果没有加withhold选项,在Commit和Rollback时,该游标将被关闭。Commit和Rollback有很多东西要注意。特别小心 . B' i; H5 b* K, H3 I: a
0 x9 c- p5 f. v" Y5 F1 c游标的两种定义方式 : W" R# }: _# \! n, @
一种为 . V/ S9 H" O3 N
declarecontinuehandlerfornotfound 1 [+ @9 z1 O0 e' ^
begin " N/ D X6 D" H8 l
setv_notfound=1;
- l; _2 `& G& q8 lend; ; t! y5 u" X4 e* k
8 [& H O9 r$ N+ J: H4 c* r7 `
declarecursor1cursorwithholdforselectmarket_codefromtb_market_code forupdate; / y& s) G* E' p- l6 [) `1 E
opencursor1;
^8 E) A& ~) }+ Qsetv_notfound=0;
6 P I! [. b8 ]1 P7 k9 Rfetchcursor1intov_market_code;
7 r+ e' b) i" L' u( q" Z# |whilev_notfound=0Do 3 Y( O$ \' z D% s
--work : n3 }5 g/ S j: D) P9 L$ H
setv_notfound=0;
" r0 d9 `- Q' o2 v' Zfetchcursor1intov_market_code; 6 w* k: z( O; H/ T3 r
endwhile;
# N7 j6 b$ h7 e5 U0 Iclosecursor1; , s& v0 D( C1 A6 Q9 W* d
这种方式使用起来比较复杂,但也比较灵活。特别是可以使用withhold选项。如果循环内有commit或rollback而要保持该cursor不被关闭,只能使用这种方式。
点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹