zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python入门之函数及其方法
    Python入门知识点2---字符串
    Python列表 元组 字典 以及函数
    Python入门知识
    Autofac使用代码
    优化EF以及登录验证
    CRM框架小知识以及增删查改逻辑代码
    分页SQL
    触发器SQL
    动态生成lambda表达式
  • 原文地址:https://www.cnblogs.com/hushzhang/p/12627750.html
Copyright © 2011-2022 走看看