游标的使用

在之前的操作中,我们都是对整个表,或者是根据条件选出来的表的部分作为一个整体进行操作

缺乏一个对表的每个元组进行逐一操作的语句,所以引入了游标的概念,它的作用有点类似于高级语言中的数组下标,可以对选中的表中的每个元组进行逐一操作

 

游标的使用方法:

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;

 

posted @ 2022-03-30 10:44  jue1e0  阅读(144)  评论(0)    收藏  举报