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

DB2中游標使用的問題解析

編輯:DB2教程

在使用DB2數據庫中的游標時,您可能會有這些問題:如果對一個表設置了游標,可不可以同時對這個表進行update操作? 怎麼樣操作才不會影響游標的位置? 本文將為您講解處理的方法,供您參考。

使用定位操作更改行 

可更新游標支持通過游標更新行的數據修改語句。當定位在可更新游標中的某行上時,您可以執行更新或刪除操作,這些操作針對用於在游標中建立當前行的基表行。  
   這些就稱為定位更新。  
 
定位更新在打開游標的同一個連接上執行。  
   這就允許數據修改共享與游標相同的事務空間,並且使游標保持的鎖不會阻止更新。  
 
有兩種方法在游標中執行定位更新:    
   UPDATE  或  DELETE  語句中的  Transact-SQL  WHERE  CURRENT  OF  子句。  
   數據庫  API  定位更新函數或方法,如  ODBC  SQLSetPos  函數。  
 
使用  Transact-SQL  執行定位更新  
   Transact-SQL  WHERE  CURRENT  OF  子句典型用於  Transact-SQL  存儲過程、觸發器以及腳本  
 (當需要根據游標中特定行進行修改時)。存儲過程、觸發器、或腳本將:  
   DECLARE  和  OPEN  游標。  
   用  FETCH  語句在游標中定位於一行。  
   用  WHERE  CURRENT  OF  子句執行  UPDATE  或  DELETE  語句。用  DECLARE  語句中的  cursor_name    
   作為  WHERE  CURRENT  OF  子句中的  cursor_name。    
例程:  
declare    cursor_name    cursor    for      
select    *    from    T2  
for  update      
open    cursor_name      
fetch    next    from    cursor_name      
while  @@Fetch_Status  =  0    
begin  
update    T2  set  sname  =  'lx_'  +  sname  --right(sname,len(sname)-3)    
where    current    of    cursor_name      
fetch    next    from    cursor_name      
end  
close  cursor_name  
deallocate  Cursor_Name 

在DB2中也有類似的用法,由於DB2中的SQL語法和SQL Server有所不同,所以DB下的存儲過程如下:
CREATE PROCEDURE KYJT.SP_TESTT ( ) 
  SPECIFIC KYJT.SQL060421171925193
  LANGUAGE SQL
  NOT DETERMINISTIC
  CALLED ON NULL INPUT
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS
BEGIN
DECLARE   PNAME VARCHAR(50);
DECLARE PID INT;
DECLARE   v_count int;
DECLARE   SQLSTATE   CHAR(5);     
DECLARE   at_end   INT   DEFAULT   0;   
DECLARE not_found CONDITION FOR SQLSTATE '02000';

DECLARE C1 CURSOR FOR SELECT ID,NAME FROM KYJT.TESTT FOR UPDATE ;
DECLARE   CONTINUE   HANDLER   FOR   not_found   
SET   at_end   =   1;     
 OPEN C1;
 INS_LOOP:      
 LOOP
FETCH C1 INTO PID,PNAME;  
if at_end = 1 then
LEAVE INS_LOOP;
END IF;
UPDATE KYJT.TESTT A
SET NAME = (SELECT NAME FROM KYJT.TEST B WHERE B.ID=PID) WHERE CURRENT OF C1;
END LOOP; 
 CLOSE C1;
END

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