DB2的游標(update時的問題) 今天下午,突然收到實施人員在現在場發回來的問題,其中有一個問題我怎麼也想不出原因,直到後上網找資料,並重新測試了程序,才發現這個問題。問題來自於數據庫的一個存儲過程。 www.2cto.com Java代碼 --變量聲明 -- .... -- 判斷游標是否結束 declare v_curOver integer default 0; --聲明游標 declare c_CCDZ cursor for select nvl(COL1, '') from TABLE1 where COL2=in_COL2; --聲明異常處理,當游標結束時觸發此異常(此句要放在最後聲明) declare continue handler for not found set v_curOver=1; set v_curOver=0; open c_CCDZ; CCDZLoop: loop -- 注意:只有先fetch後才能有異常 fetch c_CCDZ into v_COL1; if v_curOver=1 then leave CCDZLoop; end if; update TABLE2 set COL11 = '01' where COL = v_COL1; end loop CCDZLoop; close c_CCDZ; 這裡是在一個游標裡更新另一個表。因為以前我做查詢操作時都這樣寫的,但是不涉及到增改操作,當時自己測試大意時間又趕,隨意測了一個數據(沒想到數據只有一條記錄),沒問題就算通過了。以致出現了以下問題,游標裡有N條記錄,但是執行了一次更新語句,余下的被無視了,後來上網查了資料,才知道了,以上定義,更新操作時會使游標跳到末端,所以只更新了第一條記錄。 於是我用了另一種方法。 Java代碼 declare cursor1 cursor for select T1_COL2 from TABLE1 where T1_COL1 = in_COL1; select count(1) into v_NUM from TABLE1 where T1_COL1 = in_COL1; open cursor1; cursorLoop1: loop fetch cursor1 into v_COL2; if v_curOver=v_NUM then leave cursorLoop1; end if; --更新 update TABLE2 set COL2 = '01' where COL1 = v_COL2; set v_curOver = v_curOver + 1; end loop cursorLoop1; close cursor1; 這樣就可以按預想那樣更新數據了。當然以上只是本人參考了網上資料想到的方法,這裡拋磚引玉,有更好的方法還請賜教,讓大家都可以學習一下! 總結一下,方法1適合用於查詢,靠判斷游標的狀態來循環;方法適用於更新,但要自己計算循環次數。