注意:关于示例所讲到的存储过程和函数及数据库表的创建,可通过查看之前的文章有进行介绍。。。
通过MySQL查询数据库,其结果可能为多条记录。在存储过程和函数中使用光标可以实现逐条读取结果集中的记录。
光标使用包括声明光标(DECLARE CURSOR)、打开光标(OPEN CURSOR)、使用光标(FETCH CURSOR)和关闭光标(CLOSE CURSOR)。值得一提的是,光标必须声明在处理程序之前,且声明在变量和条件之后。
1 声明光标
在MySQL中,声明光标仍使用关键字DECLARE,其语法如下:
DECLARE cursor_name CURSOR FOR select_statement
其中,
- cursor_name是光标的名称,光标名称的使用于表名同样的规则;
- select_statement是一个SELECT语句,返回一行或多行数据。
该语句也可以在存储过程中定义多个光标,但是必须保证每个光标名称的唯一性,即每一个光标必须有自己唯一的名称。
通过上述定义来声明光标info_of_student,其代码如下:
declare info_of_student cursor for select sid,name,age,sex,age from studentinfo where sid=1;
说明:
这里SELECT子句中不能包含INTO子句,并且光标只能在存储过程或存储函数中使用。上述代码并不能单独执行。
2 打开光标
在光标声明之后,要从光标中提取数据,必须首先打开光标。在MySQL中使用关键字OPEN来打开光标,其基本的语法如下:
OPEN cursor_name
其中,cursor_name参数标识光标的名称。
在程序中,一个光标可以打开多次。由于可能在用户打开光标后,其他用户或程序正在更新数据表,所以可能导致用户每次打开光标后,显示的结果都不同。
打开上面已经声明的光标info_of_student,其代码如下:
open info_of_student;
3 使用光标
光标在顺利打开后,可以使用FETCH..INTO语句来读取数据,其语法如下所示:
FETCH cursor_name into var_name[,var_name]....
其中,
- cursor_name代表已经打开光标的名称;
- var_name参数表示将光标中的SELECT语句查询出来的信息存入该参数中。
var_name是存放数据的变量名,必须在声明光标前定义好。FETCH…INTO语句与SELECT…INTO语句具有相同的意义。
将已打开的光标info_of_student中SELECT语句查询出来的信息存入tmp_name和tmp_tel中。其中,tmp_name和tmp_tel必须在使用前定义。其代码如下。
fetch info_of_student into tpm_name,tmp_tel;
4 关闭光标
光标使用完毕后,要及时进行关闭,在Mysql中使用关键字CLOSE关闭光标,其语法格式如下:
CLOSE cursor_name
cursor_name 参数标识光标名称。下面关闭已经打开的光标info_of_student,其代码如下:
CLOSE info_of_student
说明
对于已经关闭的光标,在其关闭之后使用关键字FETCH来使用光标。光标在使用完毕之后一定要关闭。