一.流程控制-判断
1.条件判断语句if
– 语法:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] …
[ELSE statement_list]
END IF
eg:计算员工工龄,并根据工龄获取称谓。
-- 计算员工工龄
DELIMITER $$
USE stores$$
DROP PROCEDURE IF EXISTS hiretime$$
CREATE PROCEDURE hiretime(IN employeer_no DATE)
BEGIN
DECLARE result VARCHAR(32);
IF TIMESTAMPDIFF(YEAR,employeer_no,NOW())>40
THEN SET result='元老';
ELSEIF TIMESTAMPDIFF(YEAR,employeer_no,NOW())>38
THEN SET result='老员工';
ELSE
SET result='新手';
END IF;
SELECT result;
SELECT TIMESTAMPDIFF(YEAR,employeer_no,NOW());
END$$
DELIMITER ;
CALL hiretime('1981-09-28');
2.条件判断语句case
– 语法:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] …
[ELSE statement_list]
END CASE
– 语法二:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] …
[ELSE statement_list]
END CASE
eg: 根据成绩评定等级。
语法一:
-- 语法一 DELIMITER $$ USE stores$$ DROP PROCEDURE IF EXISTS ps_hire_case$$ CREATE PROCEDURE ps_hire_case(IN score INT) BEGIN DECLARE result VARCHAR(24); CASE score WHEN 90 THEN SET result='高级'; WHEN 80 THEN SET result='中高级'; WHEN 70 THEN SET result='中级'; WHEN 60 THEN SET result='低中级'; WHEN 40 THEN SET result='低级'; ELSE SET result='普通人'; END CASE; SELECT result; END $$ DELIMITER ; CALL ps_hire_case(90);
语法二:
-- 语法二 DELIMITER $$ USE stores $$ DROP PROCEDURE IF EXISTS ps_hire_case$$ CREATE PROCEDURE ps_hire_case(IN score INT) BEGIN DECLARE result VARCHAR(32); CASE WHEN score>90 THEN SET result='高分'; WHEN score >80 THEN SET result='合格'; WHEN score>60 THEN SET result='及格'; WHEN score>40 THEN SET result='不及格'; ELSE SET result='差'; END CASE; SELECT result; END$$ DELIMITER ; CALL ps_hire_case(50);
二.流程控制-循环
循环语句loop
– 语法
[begin_label:] LOOP
statement_list
END LOOP [end_label]
说明
需要说明,loop是死循环,需要手动退出循环,我们可以使用leave来退出。
可以把leave看成我们java中的break;与之对应的,就有iterate(继续循环)——类比java的continue
ag:
--需求:循环打印1到10
-- leave控制循环的退出
delimiter $$
create procedure sp_flow_loop()
begin
declare c_index int default 1;
declare result_str varchar(256) default '1';
cnt:loop
if c_index >= 10
then leave cnt;
end if;
set c_index = c_index + 1;
set result_str = concat(result_str,',',c_index);
end loop cnt;
select result_str;
end$$
-- iterate + leave控制循环
delimiter $$
create procedure sp_flow_loop02()
begin
declare c_index int default 1;
declare result_str varchar(256) default '1';
cnt:loop
set c_index = c_index + 1;
set result_str = concat(result_str,',',c_index);
if c_index < 10 then
iterate cnt;
end if;
-- 下面这句话能否执行到?什么时候执行到? 当c_index < 10为false时执行
leave cnt;
end loop cnt;
select result_str;
end$$



