学堂 学堂 学堂公众号手机端

游标

lewis 5年前 (2020-02-03) 阅读数 6 #技术
游标

我们通过sql语句查询到一组数据后,可以通过游标对一组数据的每条数据进行单独操作。游标又可以理解为一组数据的集合。

静态游标

声明一个游标,并将通过select语句查询出的一组数据放入游标中。

declare cursor_name cursor for
 select userId from table1 where name = XXX;

打开游标,对应在操作后还需要关闭游标。


open cursor_name

提取游标

Fetch
[ [Next|prior|Frist|Last|Absoute n|Relative n ]
from ]
[Global] cursor_name
[into @variable_name[,....]]

参数说明:

Frist:结果集的第一行Prior:当前位置的上一行Next:当前位置的下一行Last:最后一行Absoute n:从游标的第一行开始数,第n行。Relative n:从当前位置数,第n行。Into @variable_name[,...] : 将提取到的数据存放到变量variable_name中。
游标经常会和全局变量@@FETCH_STATUS与WHILE循环来共同使用,以达到遍历游标所在数据集的目的,例如:
@@fetch_status 是一个全局变量
返回上一次使用游标fetch操作所返回的状态值

0 fetch语句成功

-1 fetch语句失败或者此行不在结果集中
-2 被提取的行不存在

declare @userId int
fetch next from cursor_name into @userId
while @@fetch_status=0  --提取成功,进行下一条数据的提取操作
begin
   select @userId as id
   fetch  next from cursor_name into @userId  --移动游标
end 

关闭游标

open cursor_name

释放游标

deallocate cursor_name
动态游标

动态游标对比静态游标来说,使得定义游标时的sql语句变得动态。当我们进行多条件查询时,有时候会进行学号查询,有时候会通过姓名查询,有时候是姓名和学号组合查询,这时候使用动态游标,对于前台传来的不同情况的参数进行判断并拼接查询语句,然后再定义游标。

String sql = "select userId from table1 where 1 = 1";
if (name != null) {
    sql += "and name like '%" + name + "%'";
}
if (num != null) {
    sql += "and num like '%" + num + "%'";
}

// 根据sql准备并定义游标

其他操作与静态游标相同

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门