ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
流程控制 MySQL支持if,case,iterate,leave,loop,while,repeat语句作为存储过程和函数中的流程控制语句,另外return语句也是函数中的特定流程控制语句 1、case Case语句在存储过程或函数中表明了复杂的条件选择语句 第一个语句中case_value与后面各句的when_value依次做相等的对比,如果碰到相等的,则执行对应的后面的statement_list,否则接着对比,如果都没有匹配,则执行else后面的statement_list 第二个语句中当search_condition满足true/1的结果时,则执行对应的statement_list,否则执行else对应的statement_list Statement_list可以包含一个或多个SQL语句 ``` delimiter // CREATE PROCEDURE exp_case(v_sid int) BEGIN DECLARE v INT DEFAULT 1; select sex into v from students where sid=v_sid; CASE v WHEN 0 THEN update students set sex=1 where sid=v_sid; WHEN 1 THEN update students set sex=0 where sid=v_sid; ELSE update students set sex=-1 where sid=v_sid; END CASE; END; // delimiter ; mysql> call exp_case(1); Query OK, 1 row affected (0.01 sec) ``` 2、if IF语句在存储过程或函数中表明了基础的条件选择语句 if search_condition then statement_list elseif search_condition then statement_list.... else statement_list end if IF语句中如果search_condition满足true/1的条件,则执行对应的statement_list,否则再判断elseif中的search_condition是否满足true/1的条件,如果都不满足则执行else中的statement_list语句 Statement_list中可以包含一个或多个SQL语句 ``` DELIMITER // CREATE FUNCTION SimpleCompare(n INT, m INT) RETURNS VARCHAR(20) BEGIN DECLARE s VARCHAR(20); IF n > m THEN SET s = '>'; ELSEIF n = m THEN SET s = '='; ELSE SET s = '<'; END IF; SET s = CONCAT(n, ' ', s, ' ', m); RETURN s; END // DELIMITER ; mysql> select simplecompare(1,2); +--------------------+ | simplecompare(1,2) | +--------------------+ | 1 < 2 | ``` ``` DELIMITER // CREATE FUNCTION VerboseCompare (n INT, m INT) ##嵌套if语句 RETURNS VARCHAR(50) BEGIN DECLARE s VARCHAR(50); IF n = m THEN SET s = 'equals'; ELSE IF n > m THEN SET s = 'greater'; ELSE SET s = 'less'; END IF; SET s = CONCAT('is ', s, ' than'); END IF; SET s = CONCAT(n, ' ', s, ' ', m, '.'); RETURN s; END // DELIMITER ; mysql> select verbosecompare(1,2); +---------------------+ | verbosecompare(1,2) | +---------------------+ | 1 is less than 2. | ``` 3、iterate Iterate语句仅出现在loop,repeat,while循环语句中,其含义表示重新开始此循环 iterrate label ##### Label表示自定义的标签名 4、leave Leave语句表明退出指定标签的流程控制语句块 leave label ##### Label表示自定义的标签名 ``` mysql> delimiter // mysql> CREATE PROCEDURE doiterate(IN p1 INT, OUT p2 int) -> BEGIN -> label1: LOOP -> SET p1 = p1 + 1; -> IF p1 < 10 THEN ITERATE label1; END IF; -> LEAVE label1; -> END LOOP label1; -> set p2=p1; -> END; -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; ``` 5.loop Loop语句是存储过程或函数中表达循环执行的一种方式 [begin_label:] LOOP statement_list END LOOP [end_label] 6、repeat repeat语句是存储过程或函数中表达循环执行的一种方式 ``` [begin_label:] REPEAT statement_list UNTIL search_condition END REPEAT [end_label] ``` ``` mysql> CREATE PROCEDURE dorepeat(p1 INT) -> BEGIN -> SET @x = 0; -> REPEAT -> SET @x = @x + 1; -> UNTIL @x > p1 END REPEAT; -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> CALL dorepeat(1000)// Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x// +------+ | @x | +------+ | 1001 | +------+ 1 row in set (0.00 sec) ``` 7、while while语句是存储过程或函数中表达循环执行的一种方式 Syntax: [begin_label:] WHILE search_condition DO statement_list END WHILE [end_label] 当search_condition返回为true时,则循环执行statement_list中的语句,直到search_condition的结果返回为false Statement_list中可以包含一个或多个SQL语句 ``` DELIMITER // CREATE PROCEDURE dowhile() BEGIN DECLARE v1 INT DEFAULT 5; WHILE v1 > 0 DO update students set sex=-1 where sid=v1; SET v1 = v1 - 1; END WHILE; END; // DELIMITER ; mysql> call dowhile(); Query OK, 1 row affected (0.00 sec) mysql> select * from students; +------+-------+------+ | sid | sname | sex | +------+-------+------+ | 1 | a | -1 | | 2 | b | -1 | | 3 | c | -1 | ``` 8、return Return语句用在函数中,用来终结函数的执行并将指定值返回给调用者 return expr 在函数中必须要有至少一个return语句,当有多个return语句时则表明函数有多种退出的方式 ``` delimiter // create function doreturn() returns int begin select sex into @a from students where sid=1; if @a=1 then return 1; elseif @a=0 then return 0; else return 999; end if; end; // delimiter ; mysql> select doreturn(); +------------+ | doreturn() | +------------+ | 999 | ```