DB2中游標的使用方法以及存儲過程的寫法
問題1:
什么時候才會發生not found異常 ,以及db2中sqlcode的值是如何變化的?
在db2中,一條select 語句也有可能發生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;
如果此時沒有檢索到記錄,那么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
--注如果發生not found那么此時的sqlcode必定為100
set sql_code=sqlcode;/*在這里sqlcode的值為100;*/
--如果再次得到sqlcode的值那么它的值變為0
set sql_code=sqlcode;/*這里sqlcode變成了0,因為上一條語句執行成功了,那么sqlcode變成了0*/
end;
select app_class_code into classCode from kf_app_class where app_name='無效記錄';
set sql_code=sqlcode;/*同理此時如果沒有取到數據,那么會進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:
定義了游標,怎么fecth一條記錄,怎么進行循環?
Q:定義了游標假設發生not found 異常,那么是在open cursorName的時候還是在fecth的時候發生異常?
A:檢驗游標中的數據是否取完或者有無記錄,應該在fecth的時候,而不是發生在open cursorName的時候,
下面一個例子詳細的說明了游標使用過程:
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的其他異常處理
對應 oracle的 when other exceptions
declare exit handler for sqlwaring,sqlexcption
begin
--處理異常
end;
當程序執行exit handler異常處理后,那么會退出程序,不會在接著執行,也就是
declare exit handler for sqlwaring,sqlexcption
begin
--處理異常
end;
sql語句1;
sql語句2;
執行sql語句1發生異常,會進入 exit handler ,然后退出程序,不會在執行 sql語句2
