游标的使用
在之前的操作中,我们都是对整个表,或者是根据条件选出来的表的部分作为一个整体进行操作
缺乏一个对表的每个元组进行逐一操作的语句,所以引入了游标的概念,它的作用有点类似于高级语言中的数组下标,可以对选中的表中的每个元组进行逐一操作
游标的使用方法:
1.创建游标
CREATE 游标名 CURSOR FOR 游标所在的表;
2.打开游标
OPEN 游标名
3.使用游标
FETCH 游标名 INTO 定义的一个变量 #这个变量被赋予游标的特征,即表示该变量可以直接调用(会默认取此时游标中对应的属性值,并将游标下移一位)
被定义的变量只能用于查找和定位所要的表的内容,不能通过改变这个变量来改变表中的数据信息。
一般放在WHILE循环内 DECLARE变量声明后再使用
4.关闭游标
CLOSE 游标名
通过游标遍历表中的元组应用实例:
1 #举例:创建存储过程“get_count_by_limit_total_salary()”,声明IN参数 limit_total_salary, 2 #DOUBLE类型;声明OUT参数total_count,INT类型。函数的功能可以实现累加薪资最高的几个员工的薪资值, 3 #直到薪资总和达到limit_total_salary参数的值,返回累加的人数给total_count。 4 5 DELIMITER // 6 7 CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE,OUT total_count INT) 8 BEGIN 9 10 #声明局部变量 11 DECLARE sum_sal DOUBLE DEFAULT 0.0; #记录累加的工资总额 12 DECLARE emp_sal DOUBLE; #记录每一个员工的工资 13 DECLARE emp_count INT DEFAULT 0;#记录累加的人数 14 15 16 #1.声明游标 17 DECLARE emp_cursor CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC; 18 19 #2.打开游标 20 OPEN emp_cursor; 21 22 REPEAT 23 24 #3.使用游标 25 FETCH emp_cursor INTO emp_sal; 26 27 SET sum_sal = sum_sal + emp_sal; 28 SET emp_count = emp_count + 1; 29 UNTIL sum_sal >= limit_total_salary 30 END REPEAT; 31 32 SET total_count = emp_count; 33 34 #4.关闭游标 35 CLOSE emp_cursor; 36 37 END // 38 39 DELIMITER ;
通过游标遍历并修改表中元组的实例:
1 #将部门号为dept_id的部门中的前change_sal_count位的员工的工资变为1.5倍 2 DELIMITER // 3 CREATE PROCEDURE update_salary(IN dept_id INT,IN change_sal_count INT) 4 BEGIN 5 DECLARE emp_count INT DEFAULT 1; 6 DECLARE emp_id INT; 7 8 CREATE emp_cursor CURSOR FOR SELECT employee_id FROM employees WHERE department_id = dept_id; 9 OPEN emp_cursor; 10 11 WHILE emp_count < change_sal_count DO 12 FETCH emp_cursor INTO emp_id; 13 14 UPDATE employees SET salary = salary * 1.5; 15 WHERE employee_id = emp_id ; 16 17 SET emp_count = emp_count + 1; 18 END WHILE; 19 END // 20 DELIMITER;