MySQL游标操作指南

本篇文章是对MySQL游标的具体使用进行了详细的分析介绍,需要的朋友参考下

 
-- 测试表 level 

-- 代码如下:

create table test.level (name varchar(20));

-- 再 insert 些数据 ;
 
-- 初始化

-- 代码如下:


drop procedure if exists useCursor //

-- 建立 存储过程 create
-- 代码如下:

CREATE PROCEDURE useCursor()
   
BEGIN

-- 局部变量的定义 declare
--  代码如下:
declare tmpName varchar(20) default '' ; 
declare allName varchar(255) default '' ; 
declare cur1 CURSOR FOR SELECT name FROM test.level ;

-- MySQL 游标 异常后 捕捉
 

-- 并设置 循环使用 变量 tmpname 为 null 跳出循环。

-- 代码如下:

declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null;
  

-- 开游标
-- 代码如下:
OPEN cur1;
  

-- 游标向下走一步
-- 代码如下:
FETCH cur1 INTO tmpName;
  

-- 循环体 这很明显 把MySQL 游标查询出的 name 都加起并用 ; 号隔开
-- 代码如下:

WHILE ( tmpname is not null) DO
set tmpName = CONCAT(tmpName ,";") ;
set allName = CONCAT(allName ,tmpName) ;
  

-- 游标向下走一步
-- 代码如下:


FETCH cur1 INTO tmpName;
  

-- 结束循环体: 
-- 代码如下:

END WHILE;
  

-- 关闭游标
-- 代码如下:
CLOSE cur1;
  

-- 选择数据
--  代码如下:
select allName ;
  

-- 结束存储过程
--  代码如下:
END;//
  

-- 调用存储过程:
--  代码如下:


call useCursor()//
 

-- loop循环游标:
--  代码如下:
DELIMITER $$ 
 
DROP PROCEDURE IF EXITS cursor_example$$ 
CREATE PROCEDURE cursor_example() 
     READS SQL DATA 
BEGIN 
     DECLARE l_employee_id INT; 
     DECLARE l_salary NUMERIC(8,2); 
     DECLARE l_department_id INT; 
     DECLARE done INT DEFAULT 0; 
     DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 
 
     OPEN cur1; 
     emp_loop: LOOP 
         FETCH cur1 INTO l_employee_id, l_salary, l_department_id; 
         IF done=1 THEN 
             LEAVE emp_loop; 
         END IF; 
     END LOOP emp_loop; 
     CLOSE cur1; 
END$$ 
DELIMITER ;
  

-- repeat循环游标:
--  代码如下:
/*创建过程*/
DELIMITER //
DROP PROCEDURE IF EXISTS test //
CREATE PROCEDURE test()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE a VARCHAR(200) DEFAULT '';
    DECLARE c VARCHAR(200) DEFAULT '';
 
    DECLARE mycursor CURSOR FOR SELECT  fusername FROM uchome_friend;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
 
    OPEN mycursor;
 
    REPEAT
        FETCH mycursor INTO a;
        IF NOT done THEN
            SET c=CONCAT(c,a);/*字符串相加*/
        END IF;
 
    UNTIL done END REPEAT;
 
    CLOSE mycursor;
 
    SELECT c;
END //
DELIMITER ;
  

 代码如下:


/*创建过程*/
DELIMITER //
DROP PROCEDURE IF EXISTS test //
CREATE PROCEDURE test()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE a VARCHAR(200) DEFAULT '';
    DECLARE c VARCHAR(200) DEFAULT '';
 
    DECLARE mycursor CURSOR FOR SELECT  fusername FROM uchome_friend;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
 
    OPEN mycursor;
 
    REPEAT
        FETCH mycursor INTO a;
        IF NOT done THEN
            SET c=CONCAT(c,a);/*字符串相加*/
        END IF;
 
    UNTIL done END REPEAT;
 
    CLOSE mycursor;
 
    SELECT c;
END //
DELIMITER ;