注意:MySQL游标只能用于 存储过程(和函数)。
创建游标
在创建一个游标前,我们需要先清除游标的语法
1、定义游标
- DECLARE 游标名称 CURSOR FOR SQL语句;
2、打开游标
- OPEN 游标名称;
3、获取结果
- FETCH 游标名称 INTO 变量名称[,变量名称];
4、关闭游标
- CLOSE 游标名称;
我们以Customers表来作为示例
示例一
定义一个存储过程,调用的时候执行里面的游标
- CREATE PROCEDURE PROC1()
- BEGIN
- -- 定义两个存放结果的变量
- DECLARE NAME VARCHAR(20);
- DECLARE ADDR VARCHAR(50);
- -- 声明游标
- DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers;
- -- 打开游标
- OPEN MY;
- -- 获取结果
- FETCH MY INTO NAME,ADDR;
- -- 这里是为了显示获取结果
- SELECT NAME,ADDR;
- -- 关闭游标
- CLOSE MY;
- END;
我们执行完上面的存储过程后,就可以调用该存储过程了
- CALL PROC1();
得到结果:
这里肯定有小伙伴好奇,customers表里明明有7条记录,为什么只显示了1条记录?
这是因为游标的变量只保留了customers表中的第一行数据,如果要查看后面的数据,就需要循环往下移动游标,才能继续查看。
示例二
定义一个存储过程,调用存储过程时,将表customers里的数据循环写入新的表里面。
- CREATE PROCEDURE PROC2()
- BEGIN
- -- 定义两个存放结果的变量
- DECLARE FLAG INT DEFAULT 0;
- DECLARE NAME VARCHAR(20);
- DECLARE ADDR VARCHAR(50);
- -- 声明游标
- DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers;
-
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG=1;
- -- 打开游标
- OPEN MY;
- -- 循环体部分
- L1:LOOP
- -- 获取结果
- FETCH MY INTO NAME,ADDR;
- IF FLAG=1 THEN
- LEAVE L1;
- END IF;
- -- 这里是为了显示获取结果
- INSERT INTO cus VALUES(NAME,ADDR);
- -- 关闭游标
- END LOOP; -- 结束循环
- CLOSE MY;
- END;
然后我们执行这个存储过程,并查询cus表里的数据
- CALL PROC2();
-
- SELECT * FROM cus;
结果:
结果与customers里的一致,但是这些结果是循环一条一条往下移动的过程中插入的,即这个循环执行了7次。
以上就是游标的基本操作原理了,此外游标的循环体还有WHILE,REPEAT等操作方式,他们的操作方式与LOOP类似,都是用来循环执行循环体里面的内容,直到循环结束。