程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> DB2中可以讀寫的游標的定義

DB2中可以讀寫的游標的定義

編輯:SyBase綜合文章

導讀:DB2中游標是非常重要的一個概念,游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。

使用定位操作更改行 
可更新游標支持通過游標更新行的數據修改語句。當定位在可更新游標中的某行上時,您可以執行更 新或刪除操作,這些操作針對用於在游標中建立當前行的基表行。 這些就稱為定位更新。 定位更新在打開游標的同一個連接上執行。 這就允許數據修改共享與游標相同的事務空間,並且使游標保持的鎖不會阻止更新。 

有兩種方法在游標中執行定位更新: 
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