DB2中游標(biāo)的使用方法以及存儲(chǔ)過程的寫法
問題1:
什么時(shí)候才會(huì)發(fā)生not found異常 ,以及db2中sqlcode的值是如何變化的?
在db2中,一條select 語句也有可能發(fā)生not found異常,譬如:
declare sqlcode integer default 0;
declare sql_code integer default 0;
declare classCode varchar(40) ;
select app_class_code into classCode from kf_app_class where app_name='無效記錄';
set sql_code=sqlcode;
如果此時(shí)沒有檢索到記錄,那么sqlcode的值為100,有的話為0;
我們可以定義NOT FOUND 異常處理
declare sqlcode integer default 0;
declare sql_code integer default 0;
declare classCode varchar(40) ;
begin
declare continue handler for not found
begin
--注如果發(fā)生not found那么此時(shí)的sqlcode必定為100
set sql_code=sqlcode;/*在這里sqlcode的值為100;*/
--如果再次得到sqlcode的值那么它的值變?yōu)?
set sql_code=sqlcode;/*這里sqlcode變成了0,因?yàn)樯弦粭l語句執(zhí)行成功了,那么sqlcode變成了0*/
end;
select app_class_code into classCode from kf_app_class where app_name='無效記錄';
set sql_code=sqlcode;/*同理此時(shí)如果沒有取到數(shù)據(jù),那么會(huì)進(jìn)declare continue handler ,返回后sqlcode的值也為0*/
end;
所以我們可以通過兩種方法來捕獲和處理not found
方法1:
begin
declare continue handler for not found
begin
--異常處理代碼
end;
sql語句
end;
方法2:
begin
sql語句
if sqlcode=100 then
--異常處理代碼
end if;
end;
問題2:
定義了游標(biāo),怎么fecth一條記錄,怎么進(jìn)行循環(huán)?
Q:定義了游標(biāo)假設(shè)發(fā)生not found 異常,那么是在open cursorName的時(shí)候還是在fecth的時(shí)候發(fā)生異常?
A:檢驗(yàn)游標(biāo)中的數(shù)據(jù)是否取完或者有無記錄,應(yīng)該在fecth的時(shí)候,而不是發(fā)生在open cursorName的時(shí)候,
下面一個(gè)例子詳細(xì)的說明了游標(biāo)使用過程:
begin
declare sqlcode integer default 0;
declare app_code varchar(10);
declare cursor1 cursor for select app_code from kf_app_class ;
open cursor1;
cursorLoop:
loop
fecth cursor1 into app_code ;
if sqlcode=100 then leave cursorLoop;
end if;
end loop;
end;
sqlcode 可以直接用嗎?
A:在db2中,如果要使用sqlcode那么必須在使用前declare;
譬如
declare sqlcode integer default 0;
if sqlcode =? then
end if;
附注
db2的其他異常處理
對(duì)應(yīng) oracle的 when other exceptions
declare exit handler for sqlwaring,sqlexcption
begin
--處理異常
end;
當(dāng)程序執(zhí)行exit handler異常處理后,那么會(huì)退出程序,不會(huì)在接著執(zhí)行,也就是
declare exit handler for sqlwaring,sqlexcption
begin
--處理異常
end;
sql語句1;
sql語句2;
執(zhí)行sql語句1發(fā)生異常,會(huì)進(jìn)入 exit handler ,然后退出程序,不會(huì)在執(zhí)行 sql語句2
