首页  >  文章  >  php教程  >  SQL Server 游标处理 循环

SQL Server 游标处理 循环

高洛峰
高洛峰原创
2016-12-14 11:49:211115浏览

测试3条数据

CREATE TABLE test_main (
id      INT,
value   VARCHAR(10),
PRIMARY KEY(id)
);

INSERT INTO test_main(id, value) VALUES (1, 'ONE');

INSERT INTO test_main(id, value) VALUES (2, 'TWO');

INSERT INTO test_main(id, value) VALUES (3, 'THREE');

简单循环处理

 DECLARE

   @id    INT, @value VARCHAR(10);

 BEGIN

   -- 定义游标.

   DECLARE c_test_main CURSOR FAST_FORWARD FOR

     SELECT id, value FROM test_main;

   -- 打开游标.

   OPEN c_test_main;

   --填充数据.

   FETCH NEXT FROM c_test_main INTO @id, @value;

   --假如检索到了数据,才处理.

   WHILE @@fetch_status = 0

   BEGIN

     PRINT @value;

     --填充下一条数据.

     FETCH NEXT FROM c_test_main INTO @id, @value;

   END;

   -- 关闭游标

   CLOSE c_test_main;

   --释放游标.

   DEALLOCATE c_test_main;

 END;

 go

ONE

TWO

THREE  

用于更新的游标

 DECLARE

   @id    INT,  @value VARCHAR(10);

 BEGIN

   --定义游标.

   DECLARE c_test_main CURSOR FOR

     SELECT id, value FROM test_main

       FOR UPDATE;

   --打开游标.

   OPEN c_test_main;

   --填充数据.

   FETCH NEXT FROM c_test_main INTO @id, @value;

   --假如检索到了数据,才处理.

   WHILE @@fetch_status = 0

   BEGIN

     PRINT @value;

     --更新数据.

     UPDATE

       test_main

     SET

       value = value + '1'

     WHERE

       CURRENT OF c_test_main;

     --填充下一条数据.

     FETCH NEXT FROM c_test_main INTO @id, @value;

   END;

   --关闭游标

   CLOSE c_test_main;

   --释放游标.

   DEALLOCATE c_test_main;

 END;

 go

ONE

(1行受影响)

TWO

Three

SELECT * FROM test_main;

go

id          value

----------- ----------

          1 ONE1

          2 TWO1

          3 Three1



(3 行受影响)


支持来回滚动的游标

注:这里为了测试,将 test_main 表的数据,增加至11条。

DECLARE
  @id INT, @value VARCHAR(10);
BEGIN
  -- 定义游标.
  DECLARE c_test_main CURSOR  SCROLL  FOR
    SELECT id, value FROM test_main;

  -- 打开游标.
  OPEN c_test_main;

  -- 填充数据.
  FETCH FIRST FROM c_test_main INTO @id, @value;
  PRINT '游标中的第一行:' + @value;

  -- 填充数据.
  FETCH LAST FROM c_test_main INTO @id, @value;
  PRINT '游标中的最后一行:' + @value;

  -- 填充数据.
  FETCH ABSOLUTE 3 FROM c_test_main INTO @id, @value;
  PRINT '游标中的第3行[绝对地址]:' + @value;

  -- 填充数据.
  FETCH RELATIVE -2 FROM c_test_main INTO @id, @value;
  PRINT '游标中的第-2行[相对地址]:' + @value;

  -- 填充数据.
  FETCH PRIOR  FROM c_test_main INTO @id, @value;
  PRINT '游标中的上一行:' + @value;

  -- 填充数据.
  FETCH NEXT FROM c_test_main INTO @id, @value;
  PRINT '游标中的下一行:' + @value;

  -- 关闭游标
  CLOSE c_test_main;
  -- 释放游标.
  DEALLOCATE c_test_main;
END;
go


小结

SQL-92语法

DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR

FOR select_statement

[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]


Transact-SQL扩展语法

DECLARE cursor_name CURSOR

[ LOCAL | GLOBAL ]

[ FORWARD_ONLY | SCROLL ]

[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]

[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]

[ TYPE_WARNING ]

FOR select_statement

[ FOR UPDATE [ OF column_name [ ,...n ] ] ]


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn