天地不仁,以万物为刍狗!

DB2 中游标的使用以及 存储过程的写法

上一篇 / 下一篇  2007-10-24 00:00:00 / 个人分类:db2

问题1:ITPUB个人空间%O;r8r1K0a!~ c.G
什么时候才会发生not found异常 ,以及db2中sqlcode的值是如何变化的?ITPUB个人空间"f1Tx$S0{7[ oA
在db2中,一条select 语句也有可能发生not found异常,譬如
8C5h?R%L \0declare sqlcode integer default 0;
c UP2O1jZ2~4b0declare sql_code integer default 0;ITPUB个人空间AM5_ Wh
declare classCode varchar(40) ;
5~-?] E G6m O0select app_class_code into classCode from kf_app_class where app_name='无效记录';ITPUB个人空间-l`3LJ~B9^+Q _
set sql_code=sqlcode;
2c{h1BsR-`G ](}0如果此时没有检索到记录,那么sqlcode的值为100,有的话为0;
1F9PE,|(Yk0我们可以定义NOT FOUND 异常处理
oc\ L6C8jL0ITPUB个人空间[]mz4EsIn
declare sqlcode integer default 0;
-BA)|PL.c4J#l{e0declare sql_code integer default 0;
HJ v"FV!x&A0declare classCode varchar(40) ;
ZRU-jOU:]W4{S0begin
U-g,c.`/T-g0declare continue handler for not found
z5~!B[3w-~?] P v0beginITPUB个人空间,XY/i J-m0UE8x
--注如果发生not found那么此时的sqlcode必定为100
o J)Z9}I0 set sql_code=sqlcode;/*在这里sqlcode的值为100;*/
V?1|;?oCpq(L0 --如果再次得到sqlcode的值那么它的值变为0
Ww7JFvB m*p$fL0 set sql_code=sqlcode;/*这里sqlcode变成了0,因为上一条语句执行成功了,那么sqlcode变成了0*/ITPUB个人空间#GS)Ts'Mx2_
end;
XQ1K(Jd%? P*vF/X0select app_class_code into classCode from kf_app_class where app_name='无效记录';
8B Ok4i&[ A0set sql_code=sqlcode;/*同理此时如果没有取到数据,那么会进declare continue handler ,返回后sqlcode的值也为0*/
`"a*dh[8f)Ke^0end;ITPUB个人空间q8A ^'^4S+Q'bQ1w3\
所以我们可以通过两种方法来捕获和处理not foundITPUB个人空间WQ MLnj
方法1:
%wj*k_!B5Cm"?f0
4P.H,z E^0beginITPUB个人空间v't6}.UeJ1oa
declare continue handler for not foundITPUB个人空间 a.~nE5{y@
begin
RC Zd'vx,C0 --异常处理代码
4ee P8|+G0 end;
.ZOw~zt2[(Z0 sql语句
}|1\!Dl+xT0end;ITPUB个人空间E3n:P@0E#Pj a%SN
方法2:ITPUB个人空间j| oBSEW

ZV.y l pZ0begin
3K*X4f-P6`}5jt0ITPUB个人空间3^{+Nmm
sql语句
J6a&M|4dX'g)q7[&M4F'B0 if sqlcode=100 thenITPUB个人空间T~f y+_E
--异常处理代码ITPUB个人空间*OA9s*]W{`8q
end if;
*I.JN{-t7Z0end;
7`|2I:NNe:y ]0问题2:
I kv Mz(D0定义了游标,怎么fecth一条记录,怎么进行循环?
8_5@K6CW h h"[.W0Q:定义了游标假设发生not found 异常,那么是在open cursorName的时候还是在fecth的时候发生异常?ITPUB个人空间7EG|1E g!t:^
A:检验游标中的数据是否取完或者有无记录,应该在fecth的时候,而不是发生在open cursorName的时候,ITPUB个人空间)X2Y ~L E`
下面一个例子详细的说明了游标使用过程ITPUB个人空间/x1HF5X"d jk F6Ge"S

)E feF p'oH'[0beginITPUB个人空间M c%b7U-o\ bD
declare sqlcode integer default 0;
^*I+vI"q5w$B+y9HO5Dr9?0 declare app_code varchar(10);
VJ8uj'K(X0 declare cursor1 cursor for select app_code from kf_app_class ;ITPUB个人空间Kcyw3`B K
open cursor1;
7z2y'f|-B N[0 cursorLoop:ITPUB个人空间 E ME*wZ/bb7Y
loopITPUB个人空间(`;\S2z#j
fecth cursor1 into app_code ;ITPUB个人空间,FQm `Qm
if sqlcode=100 then leave cursorLoop;ITPUB个人空间g\MP%w7|o!k9b+Z
end if;
#`!K?%n0vu1a0 end loop;
A3}HZ:j9`3KH5]0end;ITPUB个人空间g$q u3t(R5e&[%e
ITPUB个人空间Ze [fc9I"cc8[
Q:sqlcode 可以直接用吗?
l2Z)zl5flD0A:在db2中,如果要使用sqlcode那么必须在使用前declare;ITPUB个人空间TK8O%z&D6zs;}![
譬如
7TQ&U`Csl:@-bB0declare sqlcode integer default 0;
X7z t g3EC O0if sqlcode =? then
&K(gK y)[8t u n0end if;
/[9o|o/]V0附注ITPUB个人空间] c)?Z |o:T
db2的其他异常处理ITPUB个人空间voU9w8Wc|
ITPUB个人空间T|1h'`!T L0Y.I
对应 oracle的 when other exceptions
$k!f;b%GuQx.x2v5rY0
g,BXEm(k9p'qD2AP#r0declare exit handler for sqlwaring,sqlexcptionITPUB个人空间|0S!vp(@(In.n7b*M l[
begin
D0WBh!h;So0--处理异常ITPUB个人空间1N2j g%m]
end;
)^#RRd;m,y)})U[K0
'R.a+GtAXo1]0当程序执行exit handler异常处理后,那么会退出程序,不会在接着执行,也就是
-`!g${;T \sLwj\Fe0ITPUB个人空间h0y zH"L r7T9?Mg*B#x
ITPUB个人空间e:`7f~~4cN
declare exit handler for sqlwaring,sqlexcption
7PM$P.CI9adc0beginITPUB个人空间'Vf2g1NE}'U5p,T/[
--处理异常
x8~B7\V;VK*h-ed0end;
KW M%\b(?x0sql语句1;ITPUB个人空间/B8mh%k{0l"\%m+w"G
sql语句2;ITPUB个人空间aI PZ;E7e
执行sql语句1发生异常,会进入 exit handler ,然后退出程序,不会在执行 sql语句2
R\T~2d9? EvG0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-11-24  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 12228
  • 日志数: 273
  • 图片数: 1
  • 文件数: 2
  • 建立时间: 2007-12-01
  • 更新时间: 2008-11-19

RSS订阅

Open Toolbar