当前位置:数据库 > DB2 >>

大侠咋样在db2的函数中定义游标?

答案:定义游标:declare <游标名> cursor for <select语句> 打开游标:open <游标名> 推进游标并读取数值:fetch <游标名> into <变量1>,<变量2>... 关闭游标:close <游标名>
其他:给你个实例吧

使用 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

上一个:DB2 中如何将date类型的转换成timestamp
下一个:小弟刚学SQL,用的是IBM DB2。一个简单的查询,出现了不一样的结果

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,