MySQL:游标
游标
我们来回顾一下之间接触的内容:
检索方式 | 功能 |
---|---|
一般检索 | 直接按照一定的条件,将所有符合的数据组合成一个结果集返回 |
计算字段 | 对检索的结果集进行整合,或者是进行运算 |
聚集函数 | 对数据集进行整体的整合分析 |
子查询 | 以一次检索的数据为基准,对这些结果进行再一次的搜索 |
联结 | 将不同表中有关联的数据,整合到一个结果集中 |
组合查询 | 将多个检索的结果,组合到一个结果集中 |
全文本搜索 | 是一种智能的搜索,可以有效地对文本数据进行检索 |
以上就是我们之前看过的知识了,不过我们发现这些操作都是对于一个结果集合而言的。但是在现实操作中我们可能需要对数据进行逐行处理,这个要求在上述的操作中都难以实现,即使可以强行实现也会有严重的性能问题。
使用游标
对于逐行操作的需求,可以使用游标 (cursor)来实现。游标是一个存储在 MySQL 服务器上的数据库查询,与 SELECT 不同的是右边本身就是通过检索构建的一个新的可调用的检索集合。游标可以理解为 C/C++ 中的指针,对于某一个结构可以用指针去访问值,游标的原理就与之类似。对于游标的使用,有以下的操作顺序:
- 定义游标,并且封装建立结果集所使用的 SELECT 语句;
- 打开游标;
- 使用封装的 SELECT 检索数据;
- 在游标填充数据的情况下,按需对行进行操作;
- 关闭游标;
游标操作
创建游标
在 MySQL 中,游标只能应用于存储过程和函数,因此对于游标的创建,首先还是得先拥有一个存储过程。拥有存储过程之后就使用 DECLARE 语句定义游标,这些语句就放到存储过程的 BEGIN 和 END 之间。代码框架如下:
DECLARE cursor_name CURSOR
FOR
SELECT 语句;
打开游标
使用游标时必须要先打开,打开之后就可以对数据进行浏览了,打开语句如下:
OPEN cursor_name;
关闭游标
游标使用完毕之后要把其关掉,关闭时占用的内存和资源会被自动释放。游标被关闭之后就不能再使用,但是可以再次被打开。语句为:
CLOSE cursor_name;
使用游标数据
使用游标数据时要用到 FETCH 语句来逐行访问,需要给出访问所需的列,这样便于游标去定向访问,同时这个语句还会促使游标向下一行移动。语句为:
FETCH row_name INTO variable;
这个语句可以用来检索指定的行,并且注入到一个变量当中。
重复操作
FETCH 语句可以将游标推进到下一行,但是它只进行一次操作,并不能实现逐行处理。这里可以使用重复语句 REPEAT:
REPEAT
MySQL 代码
UNTIL 条件语句 END REPEAT;
这个语句可以重复执行中间的代码,直到条件语句中的条件为真之后结束。
条件处理
DECLARE CONTINE HANDLER 表达式 1 SET 表达式 2:
这段代码的作用是定义一个 CONTINE HANDLER,这个的作用是当表达式 1 的条件出现时,将执行表达式 2 的语句。用这个语句可以实现条件的变更。
实例
下面使用上述的所有操作,给出相对完整的右边应用实例。
启用存储过程,并对其内容进行查看。
同时也可以去查看数据库,会发现多了一张新建的表。
参考资料
《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社
mysql游标的用法及作用