光标的使用

查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录。有些书上将光标称为游标。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,并且声明在变量和条件之后。

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语句会查询出多条记录,这种情况最好使用光标来逐条读取记录,光标必须在处理程序之前且在变量和条件之后声明,而且光标使用完毕后一定要关闭。

具体操作

mysql 存储过程输入输出 mysql存储过程cursor_数据库


mysql 存储过程输入输出 mysql存储过程cursor_sql_02


mysql 存储过程输入输出 mysql存储过程cursor_mysql_03


mysql 存储过程输入输出 mysql存储过程cursor_数据库_04


mysql 存储过程输入输出 mysql存储过程cursor_数据库_05


mysql 存储过程输入输出 mysql存储过程cursor_数据库_06

结语:

时间: 2020-07-14