光标的使用
查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录。有些书上将光标称为游标。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,并且声明在变量和条件之后。
1. 声明光标
在MySQL中,可以使用DECLARE
关键字来声明光标,其基本语法如下:
DECLARE cursor_name CURSOR
FOR select_statement;
其中,参数cursor_name表示光标的名称;参数select_statement表示SELECT语句的内容。
【示例11-2
】下面声明一个名为cur_student的光标,代码如下:
mysql> use school; #选择数据库school
mysql> DELIMITER $$
mysql> create procedure query_student (IN sid int, OUT cname varchar(128), OUT class_id int )
BEGIN
DECLARE cur_student CURSOR
FOR SELECT name, class_id FROM student;
END;
$$
DELIMITER ;
在上面的示例中,光标的名称为cur_student;SELECT语句部分是从表student中查询出字段name和class_id的值。
2. 打开光标
在MySQL中,使用关键字OPEN来打开光标,其基本语法如下:
OPEN cursor_name;
其中,参数cursor_name表示光标的名称。
下面代码打开一个名为cur_student的光标,代码如下:
OPEN cur_student;
3. 使用光标
在MySQL中,使用关键字FETCH来使用光标,其基本语法如下:
FETCH cursor_name
INTO var_name[,var_name…];
其中,参数cursor_name表示光标的名称;参数var_name表示将光标中的SELECT语句查询出来的信息存入该参数中。var_name必须在声明光标之前就定义好。
【示例11-3
】下面声明一个名为cur_student的光标,代码如下:
mysql> use school; #选择数据库school
mysql> DELIMITER $$
mysql> create procedure query_student (IN sid int, OUT cname varchar(128), OUT cid int)
BEGIN
declare tmp_name varchar(128); #必须定义在声明光标之前
declare tmp_cid int;
declare done int default 0;
declare cur_student CURSOR FOR SELECT name, class_id FROM student where id = sid;
declare continue handler for not found set done = 1; #将结束标志绑定到游标上
open cur_student;
select done;
fetch cur_student into tmp_name, tmp_cid;
select done;
select tmp_name, tmp_cid; #打印从光标中获取到的值
close cur_student;
set cname = tmp_name, cid = tmp_cid;
END;
mysql> $$
mysql> DELIMITER ;
4. 关闭光标
在MySQL中,使用关键字CLOSE来关闭光标,其基本语法如下:
CLOSE cursor_name;
其中,参数cursor_name表示光标的名称。
例如: 关闭一个名为cur_student的光标,代码如下:
CLOSE cur_student;
在上面的示例中,关闭了这个名称为cur_student的光标。关闭了之后就不能使用FETCH来使用光标了。提示
如果存储过程或函数中执行了SELECT语句,并且SELECT语句会查询出多条记录,这种情况最好使用光标来逐条读取记录,光标必须在处理程序之前且在变量和条件之后声明,而且光标使用完毕后一定要关闭。
具体操作
结语:
时间: 2020-07-14