zoukankan      html  css  js  c++  java
  • 游标的使用

    -- 游标详解

    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  --将游标向下移行,获取的数据放入之前定义的变量@id,@name中

     

     while @@fetch_status=0           --判断是否成功获取数据

     begin

     update table1 set name=name+'1'

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

     

     fetch next from cursor1 into @id,@name  --将游标向下移行

     end

     

     close cursor1                   --关闭游标

     deallocate cursor1

     

    游标一般格式:

    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 游标名称 (删除游标)

     

    --测试数据

    create table tmp1  (

       ID                   int                      not null,

       val       varchar(10),

       constraint PK_tmp1 primary key (ID)

    );

     

    create table tmp2  (

       ID                   int                      not null,

       vals       varchar(100),

       constraint PK_tmp2 primary key (ID)

    );

     

    insert into tmp1(id, val) values  (1, 'test');

    insert into tmp1(id, val) values  (2, 'test2');

    insert into tmp1(id, val) values  (3, 'test3');

    insert into tmp1(id, val) values  (4, 'test4');

    insert into tmp1(id, val) values  (5, 'test5');

     

    insert into tmp2(id, vals) values  (1, '1,2');

    insert into tmp2(id, vals) values  (2, '1,3');

    insert into tmp2(id, vals) values  (3, '2,5');

    insert into tmp2(id, vals) values  (4, '1,2,3,4,5');

     

     

    --存储过程

    drop procedure proc_tmp_1

    go

     

     

    CREATE PROCEDURE proc_tmp_1 AS

    begin

        declare @vals varchar(500)

        declare @id int

        declare @vals2 varchar(1000)

        declare @command varchar(1000)

        declare @vals3 varchar(1000)

        declare @cmd varchar(1000) 

        declare cursor_tmp_1 cursor for SELECT id, vals FROM tmp2

        open cursor_tmp_1

        fetch next from cursor_tmp_1 into @id, @vals

        while @@fetch_status = 0

        begin 

           set @vals3 = ''

           set @cmd = 'declare cursor_tmp_2 cursor for select val from tmp1 where id in (' + @vals + ')'

           EXEC (@cmd)

           open cursor_tmp_2

           fetch next from cursor_tmp_2 into @vals2

           while @@fetch_status = 0

           begin

               if (@vals3 <> '')

               begin

                  set @vals3 = @vals3 + ','

               end

               SET @vals3 = @vals3 + @vals2          

               fetch next from cursor_tmp_2 into @vals2

           end

           set @command = 'update tmp2 set vals =''' + @vals3 + ''' where id =' + convert(char, @id)

           print @command

           EXEC (@command)

           fetch next from cursor_tmp_1 into @id, @vals    

           close cursor_tmp_2

           deallocate cursor_tmp_2

        end

        close cursor_tmp_1  

        deallocate cursor_tmp_1

    end

    go

     

    --执行存储过程

    EXECUTE  proc_tmp_1

    Go

  • 相关阅读:
    3.5缺少动态连接库.so--cannot open shared object file: No such file or directory
    PHP中的变量详解
    Python类的实例属性详解
    Docker中的镜像分层技术详解
    如何编写优雅的代码?
    Node.js在不同平台的安装方法步骤详解
    Python3.X新特性之print和exec
    Django中如何配置Database缓存?
    Ajax中eval的使用详解
    如何创建和使用XMLHttpRequest对象?
  • 原文地址:https://www.cnblogs.com/yu-and-ze/p/4717338.html
Copyright © 2011-2022 走看看