行到水穷处,坐看云起时...

SQL学习之游标

上一篇 / 下一篇  2012-06-27 16:05:52 / 个人分类:SQL

1.游标的定义
    游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
2.游标的种类
    游标的分类方式有多重,按照功能MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API服务器游标和客户游标。
  (1) Transact_SQL 游标
  Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。
  (2) API游标
  API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。
  (3) 客户游标
  客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact_SQL语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。
3.游标的五种状态:
    声明状态(DECLARE)、打开状态(OPEN)、存取状态(FETCH)、关闭状态(CLOSE)、删除状态(deallocate)
4.语法
  a.声明游标 
    游标与局部变量一样,也要先声明后使用。声明游标使用DECLARE CURSOR语句,有两种语法格式,一种是支持ANSI标准的游标声明,另一种是支持T-SQL扩展的的游标声明。

           DECLARE游标名[INSENSITIVE] [SCROLL] CURSOR

           FOR SELECT语句

           [FOR {READ ONLY | UPDATE[OF字段名[,…n]]}]

 

 T-SQL扩展标准的游标声明

         DECLARE游标名称CURSOR

          [LOCAL|GLOBAL]

          [FORWARD_ONLY|SCROLL]

          [STATIC|KEYSET|DYNAMIC|FAST_FORWARD]

          [READ_ONLY|SCROLL_LOCKS|OPTIMISTIC]

          [TYPE_WARNING]

         FOR SELECT语句

          [FOR UPDATE [OF字段名[,…n]]]

    注意:①、FAST_FORWARD不能与SCROLLSCROLL_LOCKSOPTIMISTICFORWARD_ONLYUPDATE同时使用。

               ②、SELECT语句中,不能使用COMPUTE[BY]子句,也不能用INTO关键字。

               ③、系统自动将游标声明为静态游标。

               、系统自动将游标声明为只读游标。

    b.打开游标  OPEN [GLOBAL]游标名称

  c.读取游标 

          FETCH [[NEXT|PRIOR|FIRST|LAST|ABSOLUTE{n|@var}|RELATIVE{n|@变量名}]

         FROM] [GLOBAL]游标名称

          [INTO @变量名[,…n]]

    d.关闭游标

        CLOSE [GLOBAL]游标名称

    e.删除游标
       DEALLOCATE [GLOBAL]游标名称
5.示例
示例1:

--声明游标

declare my_cursor cursor keyset for select * from info

--删除游标资源

deallocate my_cursor

--打开游标,在游标关闭或删除前都有效

open my_cursor

--关闭游标

close my_cursor

--声明局部变量

declare @id int,@name varchar(20),@address varchar(20)

--定位到指定位置的记录

fetch absolute 56488 from my_cursor into @id,@name,@address

select @id as id,@name as name,@address as address

--定位到当前记录相对位置记录

fetch relative -88 from my_cursor into @id,@name,@address

select @id as id,@name as name,@address as address

--定位到当前记录前一条

fetch prior from my_cursor into @id,@name,@address

select @id as id,@name as name,@address as address

--定位到当前记录后一条

fetch next from my_cursor into @id,@name,@address

select @id as id,@name as name,@address as address

--定位到首记录

fetch first from my_cursor into @id,@name,@address

select @id as id,@name as name,@address as address

--定位到尾记录

fetch last from my_cursor into @id,@name,@address

select @id as id,@name as name,@address as address

示例2:显示所有107号课程成绩及格的记录。

 declare cur_107成绩scroll cursor

 for

 select学号,课程号,成绩

 fromxs_kc

 where课程号='107' and成绩>=60

 order by学号

 open cur_107成绩

 fetch next

 from cur_107成绩

 while @@fetch_status=0

 begin

               fetch next

               from cur_107成绩

 end

 close cur_107成绩

             deallocatecur_107成绩


TAG:

 

评分:0

我来说两句

日历

« 2024-05-02  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 10125
  • 日志数: 10
  • 书签数: 1
  • 建立时间: 2011-10-19
  • 更新时间: 2012-07-31

RSS订阅

Open Toolbar