sql 中CURSOR 的使用

原文路径(https://blog.csdn.net/a876030877/article/details/79923410

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举例如下:

 
  1.  table1结构如下

  2.  id    int

  3.  name  varchar(50)

  4.  
  5.  declare @id int

  6.  declare @name varchar(50)

  7.  declare cursor1 cursor for         --定义游标cursor1

  8.  select * from table1               --使用游标的对象(跟据需要填入select文)

  9.  open cursor1                       --打开游标

  10.  
  11.  fetch next from cursor1 into @id,@name  --将游标向下移1行,获取的数据放入之前定义的变量@id,@name中

  12.  
  13.  while @@fetch_status=0           --判断是否成功获取数据 进入循环

  14.  begin

  15.  update table1 set name=name+'1'

  16.  where id=@id                           --进行相应处理(跟据需要填入SQL文)

  17.  
  18.  fetch next from cursor1 into @id,@name  --将游标向下移1行 相当于for(int i;i<n;i++) 中的i+1

  19.  end

  20.  
  21.  close cursor1                   --关闭游标

  22.  deallocate cursor1

其中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;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值