11级_Java_曹建波6.11 存储过程体

存储过程体

2CASE语句

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条用来创建循环的语句:WHILEREPEATLOOP语句。在存储过程中可以定义0个、1个或多个循环语句。

WHILE语句语法格式为:

[begin_label:] WHILE search_condition DO

statement_list

END WHILE [end_label]

说明:语句首先判断search_condition是否为真,不为真则执行statement_list中的语句,然后再次进行判断,为真则继续循环,不为真则结束循环。begin_labelend_labelWHILE语句的标注。除非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语句,它只可以出现在LOOPREPEATWHILE语句内,意为再次循环。它的格式为:

ITERATE label

说明:该语句格式与LEAVE差不多,区别在于:LEAVE语句是离开一个循环,而ITERATE语句是重新开始一个循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值