游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH和CLOSE,其语法如下:
#声明游标 declare 游标名称 cursor for 查询语句; #打开游标 open 游标名称; #获取游标记录 fetch 游标名称 into 变量[,变量]; #关闭游标 close 游标名称;
案例:根据传入的参数usalary,来查询employees表中所有员工工资小于等于usalary的员工名和所在部门,并将用户的专业插入到所创建的一张新表(id,name,department_id)。
DROP PROCEDURE myp1; DELIMITER $ CREATE PROCEDURE myp1(IN usalary DOUBLE) BEGIN #注意创建变量要在创建游标之前!!! DECLARE empname VARCHAR(50); DECLARE empdid INT; #step1 声明游标,存储查询结果 DECLARE u_cursor CURSOR FOR SELECT CONCAT(last_name,' ',first_name),department_id FROM employees WHERE salary<=usalary; ##step2 准备:创建表结构 DROP TABLE IF EXISTS emp_under_sal; CREATE TABLE IF NOT EXISTS emp_under_sal( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(50), department_id INT ); #step3 开启游标 OPEN u_cursor; #step4 获取游标中的记录 WHILE TRUE DO #目前这里还有一个bug,等学习了handler之后就可以解决 FETCH u_cursor INTO empname,empdid; #step5 插入数据到新表中 INSERT INTO emp_under_sal VALUES(NULL,empname,empdid); END WHILE; #step6 关闭游标 CLOSE u_cursor; END$ #调用存储过程 call myp1(10000);
存储过程
handler