MySQL流程控制语句
1. WHILE
语法:
WHILE 条件 DO
……
END WHILE;
题目:
1、建立函数getPrereq_id,实现用迭代输出某个课程(作为函数输入)的所有先修课程号(包含本课程的课程号),用‘|’隔开。
输入以下两条指令以查看效果。
INSERT INTO prereq VALUES('BIO-101', 'PHY-101');
SELECT getPrereq_id('BIO-399');
2. 代码(树形查询)
参考:
https://www.jianshu.com/p/9e7c2a481e49
drop function if exists getPrereq_id;
delimiter $$
CREATE FUNCTION getPrereq_id(id varchar(8)) RETURNS VARCHAR(1000)
BEGIN
DECLARE a varchar(1000) DEFAULT id;
DECLARE r varchar(20);
set r = id;
WHILE a is not NULL DO
select GROUP_CONCAT(prereq_id seperator '|') into a from prereq where
FIND_IN_SET(course_id,a)>0;
if a is not null then
set r = concat(r,'|',a);
end if;
END WHILE;
RETURN r;
END;$$
delimiter ;
判断循环终止的条件:
1)树形查询通过查询结果为空
2)使用cursor的while循环,通过handler来捕获异常,对标志值设置值来终止循环。
例子:
create procedure sp_updatesalary()
BEGIN
DECLARE i varchar(5);
DECLARE s varchar(8);
DECLARE cur1 CURSOR FOR SELECT ID,salary FROM instructor;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET i = NULL;
OPEN cur1;
FETCH cur1 INTO i,s;
WHILE i is not null DO
IF s < 70000 THEN
UPDATE instructor SET salary = s*1.2 WHERE ID = i;
ELSE
UPDATE instructor SET salary = s*1.15 WHERE ID = i;
END IF;
FETCH cur1 INTO i,s;--个人理解最好把fetch cursor放在while的最后,保证cur为空的时候不会执行其他语句
END WHILE;
CLOSE cur1;
END;
2. IF
IF 条件 THEN
……
END IF;
注意不要忘记THEN
其他语法知识
1. MySQL的常用内置函数
- CONCAT(s1,s2,s3,s4……)
作用:连接字符串
注意,如果连接的字符串里有NULL,最后结果会变成NULL
- find_in_set(str,strlist)
返回str在strlist中第一次出现的位置,所以如果需判断str出现在strlist中,可以判断返回值是否大于0.
- GROUP_CONCAT
在作业中用于把查询得到的一组结果组合成一个字符串。操作对象是结果集中的列名。
更多相关的用法参考https://hchmsguo.iteye.com/blog/555543
2. 细节问题
- 给变量赋值要用set
- 调用过程或函数需要设置参数时可以:
set @prem = ……
call function(@prem)
select procedure(@prem)