存储过程体
(2)CASE语句
CASE语句在4.2.1节介绍选择列的时候已经涉及。这里介绍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
说明:一个CASE语句经常可以充当一个IF-THEN-ELSE语句。
第一种格式中case_value是要被判断的值或表达式,接下来是一系列的WHEN-THEN块,每一块的when_value参数指定要与case_value比较的值,如果为真,就执行statement_list中的SQL语句。如果前面的每一个块都不匹配就会执行ELSE块指定的语句。CASE语句最后以END CASE结束。
第二种格式中CASE关键字后面没有参数,在WHEN-THEN块中,search_condition指定了一个比较表达式,表达式为真时执行THEN后面的语句。与第一种格式相比,这种格式能够实现更为复杂的条件判断,使用起来更方便。
创建一个存储过程,针对参数的不同,返回不同的结果。
DELIMITER $$
CREATE PROCEDURE XSCJ.RESULT
(IN str VARCHAR(4), OUT sex VARCHAR(4) )
BEGIN
CASE str
WHEN 'M' THEN SET sex='男';
WHEN 'F' THEN SET sex='女';
ELSE SET sex='无';
END CASE;
END$$
DELIMITER ;
用第二种格式的CASE语句创建以上存储过程。程序片段如下:
CASE
WHEN str='M' THEN SET sex='男';
WHEN str='F' THEN SET sex='女';
ELSE SET sex='无';
END CASE;
(3)循环语句
MySQL支持3条用来创建循环的语句:WHILE、REPEAT和LOOP语句。在存储过程中可以定义0个、1个或多个循环语句。
WHILE语句语法格式为:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
说明:语句首先判断search_condition是否为真,不为真则执行statement_list中的语句,然后再次进行判断,为真则继续循环,不为真则结束循环。begin_label和end_label是WHILE语句的标注。除非begin_label存在,否则end_label不能被给出,并且如果两者都出现,它们的名字必须是相同的。
创建一个带WHILE循环的存储过程。
DELIMITER $$
CREATE PROCEDURE dowhile()
BEGIN
DECLARE v1 INT DEFAULT 5;
WHILE v1 > 0 DO
SET v1 = v1-1;
END WHILE;
END$$
DELIMITER ;
说明:当调用这个存储过程时,首先判断v1的值是否大于零,如果大于零则执行v1-1,否则结束循环。
REPEAT语句格式如下:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
说明:REPEAT语句首先执行statement_list中的语句,然后判断search_condition是否为真,为真则停止循环,不为真则继续循环。REPEAT也可以被标注。
用REPEAT语句创建一个如例7.9的存储过程。程序片段如下:
REPEAT
v1=v1-1;
UNTIL v1<1;
END REPEAT;
说明:REPEAT语句和WHILE语句的区别在于:REPEAT语句先执行语句,后进行判断;而WHILE语句是先判断,条件为真时才执行语句。
LOOP语句语法格式如下:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
说明:LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造,statement_list是需要重复执行的语句。在循环内的语句一直重复至循环被退出,退出时通常伴随着一个LEAVE 语句。
LEAVE语句经常和BEGIN...END或循环一起使用。结构如下:
LEAVE label
label是语句中标注的名字,这个名字是自定义的。加上LEAVE关键字就可以用来退出被标注的循环语句。
创建一个带LOOP语句的存储过程。
DELIMITER $$
CREATE PROCEDURE doloop()
BEGIN
SET @a=10;
Label: LOOP
SET @a=@a-1;
IF @a<0 THEN
LEAVE Label;
END IF;
END LOOP Label;
END$$
DELIMITER ;
说明:语句中,首先定义了一个用户变量并赋值为10,接着进入LOOP循环,标注为Label,执行减1语句,然后判断用户变量a是否小于零,是则使用LEAVE语句跳出循环。
我们调用此存储过程来查看最后结果。调用该存储过程使用如下命令:
CALL doloop();
接着,查看用户变量的值:
SELECT @a;
可以看到,用户变量a的值已经变成-1了。
循环语句中还有一个ITERATE语句,它只可以出现在LOOP、REPEAT和WHILE语句内,意为“再次循环”。它的格式为:
ITERATE label
说明:该语句格式与LEAVE差不多,区别在于:LEAVE语句是离开一个循环,而ITERATE语句是重新开始一个循环。