MYSQL游标的使用 截取字符串指定位数计算年龄、性别
一、游标的理解
mysql中游标的作用可以理解为在高级语言中的遍历,这里遍历的是一张表中的每一条记录,并作出相应的操作。
二、游标的使用
游标的使用如下:
declare 游标名 cursor for select 字段1,字段2,… from 表名 —声明游标
open 游标名 —打开游标
fetch 游标名 into 变量1,变量2,… —从游标中提取数据
…
要执行的sql语句
…
close 游标名 —关闭游标
三、举例 --利用游标计算teacher表中老师的年龄、性别(根据老师的ID)
teacher表如下:id前4位是老师的年龄,第五位是“1”位男,“2”为女性。
1.年龄的计算
代码如下:
DELIMITER $$
CREATE PROCEDURE pro_age()
MODIFIES SQL DATA
BEGIN
DECLARE t_age INT;
DECLARE n_id CHAR(10);
DECLARE state CHAR(10);
DECLARE t_year INT;
DECLARE age_cursor CURSOR FOR SELECT id FROM teacher;
DECLARE CONTINUE HANDLER FOR 1329 SET state='error';
OPEN age_cursor;
REPEAT
FETCH age_cursor INTO n_id;
UPDATE teacher SET age=(YEAR(NOW())-CONVERT(LEFT(n_id,4),SIGNED)) WHERE n_id=id;
UNTIL state='error'
END REPEAT;
CLOSE age_cursor;
END
$$
DELIMITER ;
运行结果如下:
1.1可能出现的问题
1.1.1如果声明游标时的变量个数与 fetch语句变量个数不一致时会出现以下错误:
改进方法:声明游标时写的变量个数与“遍历”时变量的个数要一致。
1.1.2 更新表时,没有加where条件限定,会导致将整个表被某个记录的结果修改。
改进方式:更新表结构时添加条件语句。
2.性别的计算
代码如下:
方法一:
DELIMITER $$
CREATE PROCEDURE pro_gen1()
MODIFIES SQL DATA
BEGIN
DECLARE state CHAR(10);
DECLARE n_gender CHAR(4);
DECLARE n_id CHAR(10);
DECLARE sex INT;
DECLARE ge_cursor CURSOR FOR SELECT id ,gender FROM teacher;
DECLARE CONTINUE HANDLER FOR 1329 SET state='error';
OPEN ge_cursor;
REPEAT
FETCH ge_cursor INTO n_id,n_gender;
SET sex=SUBSTRING(n_id,5,1);
CASE sex
WHEN 1 THEN SET n_gender='男';
WHEN 2 THEN SET n_gender='女';
ELSE SET n_gender='未知';
END CASE;
UPDATE teacher SET gender=n_gender WHERE n_id=id;
UNTIL state='error'
END REPEAT;
CLOSE ge_cursor;
END
$$
DELIMITER ;
方法二:
DELIMITER $$
CREATE PROCEDURE pro_gen1()
MODIFIES SQL DATA
BEGIN
DECLARE state CHAR(10);
DECLARE n_gender CHAR(4);
DECLARE n_id CHAR(10);
DECLARE sex INT;
DECLARE ge_cursor CURSOR FOR SELECT id FROM teacher;
DECLARE CONTINUE HANDLER FOR 1329 SET state='error';
OPEN ge_cursor;
REPEAT
FETCH ge_cursor INTO n_id;
SET sex=SUBSTRING(n_id,5,1);
IF sex=1 THEN
SET n_gender='男';
ELSEIF sex=2 THEN
SET n_gender='女';
ELSE
SET n_gender='未知';
END IF;
UPDATE teacher SET gender=n_gender WHERE n_id=id;
UNTIL state='error'
END REPEAT;
CLOSE ge_cursor;
END
$$
DELIMITER ;
运行结果: