DB2存儲過程相信大家都比較了解了,下面為您介紹的是DB2存儲過程中的兩種指針循環方式,希望對您學習DB2存儲過程能有所幫助。
DB2存儲過程中的指針循環:
DB2存儲過程有2種那個方式:for循環和while循環,如:
for循環:
- for c1 as select deliveryid,deliverycode from delivery where status=40 for read only do
- select sum(qty) into dQty from deliverydetail where deliveryid=c1.deliveryid;
- ......
- end for;
while循環:
- declare c1 cursor for select deliveryid,deliverycode from delivery where status=40 for read only ;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end_c1 = 1;
- set at_end_c1=0;
- open c1 ;
- FETCH c1 INTO ndeliveryid ,sdeliverycode;
- WHILE ( at_end_c1 = 0) do
- select sum(qty) into dQty from deliverydetail where deliveryid=ndeliveryid ;
- ...
- set at_end_c1=0;
- FETCH c1 INTO ndeliveryid ,sdeliverycode;
- END while ;
- close c1;
很明顯,for循環比while循環簡單很多
而且,對於while循環,如果不注意,很容易出現死循環
一般建議使用for循環.
但是,有時候必須使用while循環。
如果在循環中有事務,比如在循環中有一塊要求獨立事務,對於那一塊,如果執行成功 ,就提交這一塊,如果執行不成功,就回滾這一塊,繼續下一個循環,之時候就只能用while循環。
因為,當commit的時候,會自動關閉當前指針。
在while循環中,如果要commit而不關閉當前指針,要在定義指針的時候加with hold,上面的指針定義為:
- declare c1 cursor with hold for select deliveryid,deliverycode from delivery where status=40 for read only ;
對於for循環是沒有辦法處理的。
如果需要用rollback,需要定義savepoint,然後回滾到指定的回滾點。