1 select studentid,studentname,score from students;
1 DECLARE cursor_name CURSOR FOR select_statement;
1 OPEN cursor_name;
1 FETCH cursor_name INTO var_list;
1 CLOSE cursor_name;
1 mysql> select * from students; 2 +-----------+-------------+-------+---------+ 3 | studentid | studentname | score | classid | 4 +-----------+-------------+-------+---------+ 5 | 1 | brand | 97.5 | 1 | 6 | 2 | helen | 96.5 | 1 | 7 | 3 | lyn | 96 | 1 | 8 | 4 | sol | 97 | 1 | 9 | 5 | b1 | 81 | 2 | 10 | 6 | b2 | 82 | 2 | 11 | 7 | c1 | 71 | 3 | 12 | 8 | c2 | 72.5 | 3 | 13 | 9 | lala | 73 | 0 | 14 | 10 | A | 99 | 3 | 15 | 16 | test1 | 100 | 0 | 16 | 17 | trigger2 | 107 | 0 | 17 | 22 | trigger1 | 100 | 0 | 18 +-----------+-------------+-------+---------+ 19 13 rows in set
这边注释很清晰,关键知识点都已经标红mysql
1 mysql> 2 /*判断函数若是存在则删除*/ 3 DROP FUNCTION IF EXISTS fun_test; 4 /*声明结束符为$*/ 5 DELIMITER $ 6 /*建立函数,对符合条件的每一个同窗的分数进行加分,加的分数不能超过给定的值max_score*/ 7 CREATE FUNCTION fun_test(max_score decimal(10,2)) 8 RETURNS int 9 BEGIN 10 /*定义实时StudentId的变量*/ 11 DECLARE var_studentId int DEFAULT 0; 12 /*定义计算后分数的变量*/ 13 DECLARE var_score decimal(10,2) DEFAULT 0; 14 /*定义游标结束标志变量*/ 15 DECLARE var_done int DEFAULT FALSE; 16 /*建立游标*/ 17 DECLARE cur_test CURSOR FOR SELECT studentid,score from students where classid<>0; 18 /*游标结束时会设置var_done为true,后续能够使用var_done来判断游标是否结束*/ 19 DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_done=TRUE; 20 /*打开游标*/ 21 OPEN cur_test; 22 /*使用Loop循环遍历游标*/ 23 select_loop:LOOP 24 /*先获取当前行的数据,而后将当前行的数据放入var_studentId,var_score中,若是无数据行了,var_done会被置为true*/ 25 FETCH cur_test INTO var_studentId,var_score; 26 /*经过var_done来判断游标是否结束了,退出循环*/ 27 IF var_done THEN 28 LEAVE select_loop; 29 END IF; 30 /*对var_score值添加随机值,不能超过给定的分数*/ 31 set var_score = var_score + LEAST(ROUND(rand()*10,0),max_score); 32 update students set score = var_score where studentId= var_studentId; 33 END LOOP; 34 /*关闭游标*/ 35 CLOSE cur_test; 36 /*返回结果:能够根据实际状况返回须要的内容*/ 37 RETURN 1; 38 END $ 39 /*结束符置为;*/ 40 DELIMITER ; 41 Query OK, 0 rows affected
1 mysql> 2 /* 参数为8,表示加分上限为8 */ 3 select fun_test(8); 4 +-------------+ 5 | fun_test(8) | 6 +-------------+ 7 | 1 | 8 +-------------+ 9 1 row in set
对比原来的成绩的值,发现成绩添加了随机值,但没超过给定的分数 8sql
1 mysql> select * from students; 2 +-----------+-------------+-------+---------+ 3 | studentid | studentname | score | classid | 4 +-----------+-------------+-------+---------+ 5 | 1 | brand | 105.5 | 1 | 6 | 2 | helen | 98.5 | 1 | 7 | 3 | lyn | 97 | 1 | 8 | 4 | sol | 97 | 1 | 9 | 5 | b1 | 89 | 2 | 10 | 6 | b2 | 90 | 2 | 11 | 7 | c1 | 76 | 3 | 12 | 8 | c2 | 73.5 | 3 | 13 | 9 | lala | 73 | 0 | 14 | 10 | A | 100 | 3 | 15 | 16 | test1 | 100 | 0 | 16 | 17 | trigger2 | 107 | 0 | 17 | 22 | trigger1 | 100 | 0 | 18 +-----------+-------------+-------+---------+ 19 13 rows in set
符合条件被修改分数的有9条数据,都已经被触发器记录到日志里面了数据库
1 mysql> 2 /*上一篇编写了触发器,当修改students表的时候触发日志记录 */ 3 select * from triggerlog; 4 +----+--------------+---------------+-----------------------------------------+ 5 | id | trigger_time | trigger_event | memo | 6 +----+--------------+---------------+-----------------------------------------+ 7 | 1 | after | insert | new student info,id:21 | 8 | 2 | after | update | update student info,id:21 | 9 | 3 | after | update | delete student info,id:21 | 10 | 4 | after | update | from:test2,101.00 to:trigger2,106.00 | 11 | 5 | after | update | from:trigger2,106.00 to:trigger2,107.00 | 12 | 6 | after | update | delete student info,id:11 | 13 | 7 | after | update | from:brand,97.50 to:brand,105.50 | 14 | 8 | after | update | from:helen,96.50 to:helen,98.50 | 15 | 9 | after | update | from:lyn,96.00 to:lyn,97.00 | 16 | 10 | after | update | from:sol,97.00 to:sol,97.00 | 17 | 11 | after | update | from:b1,81.00 to:b1,89.00 | 18 | 12 | after | update | from:b2,82.00 to:b2,90.00 | 19 | 13 | after | update | from:c1,71.00 to:c1,76.00 | 20 | 14 | after | update | from:c2,72.50 to:c2,73.50 | 21 | 15 | after | update | from:A,99.00 to:A,100.00 | 22 +----+--------------+---------------+-----------------------------------------+ 23 15 rows in set
一、游标用来对查询结果进行遍历处理。
二、游标的使用过程:声明游标、打开游标、遍历游标、关闭游标。
三、游标主要用在循环处理、存储过程、函数中使用,用来查询结果集。
四、游标的缺点是只能一行一行操做,在数据量大的状况下,是不适用的,速度过慢。数据库大部分是面对集合的,业务会比较复杂,而游标使用会有死锁,影响其余的业务操做,不可取。 当数据量大时,使用游标会形成内存不足现象。服务器