SQL-游标

来源:互联网 发布:windows主题安卓版 编辑:程序博客网 时间:2024/06/08 05:32

数据库指针类似于字处理程序中的指针。你按下方向键时游标依次从各行文本中滚动按一下向上键,标向上跳一行而按PageUp PageDown 则会一次翻阅几行,数据库的操作也类似。数据库游标允许你选择一组数据,通过翻阅这组数据记录(通常被称为数据集检查)一个游标所在的特定的行,你可以将游标和局部变量组合在一起对每一个记录进行检查。游标移动到下一个记录时来执行一些外部操作。游标的另一个常见的用法是保存查询结果以备以后使用。一个游标结果集是通过执行SELECT 查询来建立的。如果你的应用程序或过程需要重复使用一组记录,那么第一次建立游标以后再重复使用将会比多次执行查询快得多,而且你还有在查询的结果集中翻阅的好处。

通常游标的使用过程如下:

1. Create the cursor创建游标

2. Open the cursor for use within the procedure or application.为应用程序或存储过程打开游标

3. Fetch a record's data one row at a time until you have reached the end of the cursor's records.每次从记录数据中取一行数据,直到达到游标额最后一条记录。

4. Close the cursor when you are finished with it.使用结束后关闭游标

5. Deallocate the cursor to completely discard it.释放游标。

一、创建游标

如果使用Transcat-SQL 来创建游标其语法如下

declare cursor_name cursor

for select_statement

[for {read only | update [of column_name_list]}]

使用ORACLE7 SQL 来创建和语法格式则如下

DECLAREcursor_name CURSOR

FOR {SELECT command | statement_name | block_name}

在执行DECLARE cursor_name CURSOR 语句时,你必须同时定义将要在你的所有的游标操作中使用的结果集。一个游标有两个重要的部分,游标结果集和游标的位置。下边的语句将创建一个基于ARTIST 表的结果集。

1> create Artists_Cursor cursor

2> for select * from ARTISTS

3> go

现在已经有了一个名字为ARTIST_Cursor 游标它包括了所有的ARTIST 表的内容

但是首先你必须打开游标。

二、打开游标

最简单的打开游标命令如下:

open cursor_name

运行下列命令打开ARTIST_Cursor 游标:

1> open Artists_Cursor

2> go

现在可以使用游标来翻阅结果集了。

三、使用游标来进行翻阅

要想在游标结果集中进行翻阅操作Transcat-SQL 提供了FETCH 命令。

fetch cursor_name [into fetch_target_list]

ORACLE SQL 则提供了下边的语法:

FETCH cursor_name {INTO : host_variable

[[INDICATOR] : indicator_variable]

[, : host_variable

[[INDICATOR] : indicator_variable] ]...

| USING DESCRIPTOR descriptor }

每次当FETCH 命令运行时,游标指针可以在结果集中移动一行。如果需要移动到行的数据,可以被填充到fetch_target_list 变量中。该命令不能使用INTO 子句,但是当向前跳动的行数已知时用它来代替重复执行FETCH 命令则很有用。

下边的语句将从ARTIST_Cursor 的结果集中获得数据并把它返回给程序变量:

1> declare @name char(30)

2> declare @homebase char(40)

3> declare @style char(20)

4> declare @artist_id int

5> fetch Artists_Cursor into @name, @homebase, @style, @artist_id

6> print @name

四、关闭游标

关闭游标是一个非常简单的工作,它的语句如下:

close cursor_name

这时游标依然存在,但是它必须被再次打开方可使用。关闭一个游标从本质上来说是关闭了它的结果集,而并不是它的全部内容。如果你已经完全结束了对一个游标的使用的话,DEALLOCATE 命令将释放让游标所占用的内存并且可以让游标的名字可以被再次使用。这是该命令的语法格式

deallocate cursor cursor_name

下面的用例给出了用Transcat-SQL 写的创建使用关闭释放一个游标的完整过程

1> declare @name char(30)

2> declare @homebase char(40)

3> declare @style char(20)

4> declare @artist_id int

5> create Artists_Cursor cursor

6> for select * from ARTISTS

7> open Artists_Cursor8> fetch Artists_Cursor into @name, @homebase, @style, @artist_id

9> while (@@sqlstatus = 0)

10> begin

11> print @name

12> print @homebase

13> print @style

14> print char(@artist_id)

15> fetch Artists_Cursor into @name, @homebase, @style, @artist_id

16> end

17> close Artists_Cursor

18> deallocate cursor Artists_Cursor

19> go

五、游标的适用范围

与表索引以及其它的对象如触发机制和存贮过程不同,游标在创建以后并不作为一个数据库对象来看待,所以游标的使用会受到一些限制。

切记无论何时要注意游标分配过的内存,尽管它的名字可能已经不存在了。当不在使用游标的时候或在进行游标能力之外的工作时,一定要记得关闭游标并将它释放掉。可以在下列三种情况下创建游标:

l 在会话中 — — 会话在用户登录以后。开始如果用户在登录进行SQL SERVER 以后创建了一个游标,那么游标的名字将一直存在到用户退出登录;用户不能再一次使用在本次登录中创建的游标名。

l 在存贮过程中 — — 游标在存贮过程的内部创建的好处在于,只有当过程运行时它才真正起作用,一旦过程退出了则游标的名字将不再有效。

l 在触发机制中 — — 在触发机制中创建游标与在存贮过程中创建游标所受到的限制是相同的。

原创粉丝点击