MYSQL游标的使用 截取字符串指定位数计算年龄、性别

MYSQL游标的使用 截取字符串指定位数计算年龄、性别

一、游标的理解

mysql中游标的作用可以理解为在高级语言中的遍历,这里遍历的是一张表中的每一条记录,并作出相应的操作。

二、游标的使用

游标的使用如下:
declare 游标名 cursor for select 字段1,字段2,… from 表名 —声明游标
open 游标名 —打开游标
fetch 游标名 into 变量1,变量2,… —从游标中提取数据

要执行的sql语句

close 游标名 —关闭游标

三、举例 --利用游标计算teacher表中老师的年龄、性别(根据老师的ID)

teacher表如下:id前4位是老师的年龄,第五位是“1”位男,“2”为女性。
teacher表
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条件限定,会导致将整个表被某个记录的结果修改。
没有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 ;

运行结果:
性别结果

发布了2 篇原创文章 · 获赞 2 · 访问量 65

猜你喜欢

转载自blog.csdn.net/qq_44635691/article/details/103438324