sql 中CURSOR 的使用
CURSOR是游标,常用于脚本处理。
这里主要介绍自己常用的方法,同时也会把网上的一般格式进行解释。
一、游标一般格式:
DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS=0
BEGIN
SQL语句执行过程... ...
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
END
CLOSE 游标名称
DEALLOCATE 游标名称 (删除游标)
一般格式sql举例如下:
table1结构如下 id int name varchar(50) declare @id int declare @name varchar(50) declare cursor1 cursor for --定义游标cursor1 select * from table1 --使用游标的对象(跟据需要填入select文) open cursor1 --打开游标 fetch next from cursor1 into @id,@name --将游标向下移1行,获取的数据放入之前定义的变量@id,@name中 while @@fetch_status=0 --判断是否成功获取数据 进入循环 begin update table1 set name=name+'1' where id=@id --进行相应处理(跟据需要填入SQL文) fetch next from cursor1 into @id,@name --将游标向下移1行 相当于for(int i;i<n;i++) 中的i+1 end close cursor1 --关闭游标 deallocate cursor1 ———————————————— 版权声明:本文为CSDN博主「紫叶溪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/a876030877/java/article/details/79923410
其中while循环的判断条件:
@@FETCH_STATUS =0 FETCH 语句成功
@@FETCH_STATUS =-1 FETCH 语句失败或此行不在结果集中
@@FETCH_STATUS =-2 被提取的行不存在
二、我常用的一般格式:
DECLARE 游标名称 CURSOR FOR SELECT * FROM 表名 WHERE ...
begin
dbms_output.enable(buffer_size=>null);
for 变量名 in 游标名称 loop
SQL语句执行过程... ... 获取游标里的值 直接用 变量名.字段名
END LOOP;
CLOSE 游标名称
DEALLOCATE 游标名称 (删除游标)
三、嵌套循环:
案例: 红色部分是对于第二点常用格式上的添加,使得可以在循环中嵌套循环
declare
TYPE daynamic_cursor_type IS REF CURSOR; --黄色部分自定义
cursor bscl_mc_cur is
SELECT d.bscl_mc
FROM DB_YWBZ.ecm_bscl_common_content_data@db_ywbz_sc_old d
WHERE d.bscl_mc is not null
group by d.bscl_mc;
cur_zj_rows daynamic_cursor_type; --定义游标
v_sql varchar2(500);
v_zj varchar2(10);
begin
dbms_output.enable(buffer_size=>null);
for v_bscl_mc_cur in bscl_mc_cur loop
v_sql := 'SELECT zj,ZJ_DM FROM ecm_bscl_common_content_data d WHERE d.bscl_mc = '||chr(39)||v_bscl_mc_cur.bscl_mc||chr(39); --引号,记得加
dbms_output.put_line('=========='||v_bscl_mc_cur.bscl_mc);
open cur_zj_rows for v_sql;
LOOP
FETCH cur_zj_rows INTO v_zj; --获取值
EXIT WHEN cur_zj_rows%NOTFOUND; --判断是否存在值
dbms_output.put_line(v_zj); --操作
END LOOP;
end loop;
end;
————————————————
版权声明:本文为CSDN博主「紫叶溪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a876030877/java/article/details/79923410
posted on 2020-04-03 17:27 hushzhang 阅读(1770) 评论(0) 编辑 收藏 举报