程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2的游標(update時的問題)

DB2的游標(update時的問題)

編輯:DB2教程

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適合用於查詢,靠判斷游標的狀態來循環;方法適用於更新,但要自己計算循環次數。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved