赞
踩
这两天在学习存储过程,在条件语句 CASE WHEN EHEN END CASE 的时候发现一件奇怪的事
- mysql> DROP PROCEDURE IF EXISTS `pro_test`;
- DELIMITER $$
- CREATE PROCEDURE `pro_test`(IN parameter int)
- BEGIN
- SET @parameter=parameter + 1;
- SELECT @parameter;
- CASE @parameter
- WHEN 1 THEN
- SET @parameter=parameter + 1;
- SELECT @parameter;
- WHEN 2 THEN
- SET @parameter=parameter + 2;
- SELECT @parameter;
- ELSE
- SET @parameter=parameter + 3;
- SELECT @parameter;
- END CASE ;
- END ;
- $$
- DELIMITER ;
- Query OK, 0 rows affected
-
- Query OK, 0 rows affected
-
- mysql> select @parameter;
- +------------+
- | @parameter |
- +------------+
- | 4 |
- +------------+
- 1 row in set
-
- mysql> set @parameter=2;
- Query OK, 0 rows affected
-
- mysql> call `pro_test`(@parameter
- );
- +------------+
- | @parameter |
- +------------+
- | 3 |
- +------------+
- 1 row in set
- +------------+
- | @parameter |
- +------------+
- | 5 |
- +------------+
- 1 row in set
-
- Query OK, 0 rows affected
-
- mysql>
注意看结果,为3和5,CASE没有使用存储过程里更新的@parameter(值为3)变量,而是还是输入时的@parameter(值为2)
不知道其中的理论是什么?如果有朋友知道还望不理赐教
问了下同事,问题已解决,原因是@parameter跟parameter根本不是一个变量
修改为如下就跟逻辑对的上了
- DROP PROCEDURE IF EXISTS `pro_test`;
- DELIMITER $$
- CREATE PROCEDURE `pro_test`(IN parameter int)
- BEGIN
- SET @parameter=parameter + 1;
- SELECT @parameter;
- CASE @parameter
- WHEN 1 THEN
- SET @parameter=@parameter + 1;
- SELECT @parameter;
- WHEN 2 THEN
- SET @parameter=@parameter + 2;
- SELECT @parameter;
- ELSE
- SET @parameter=@parameter + 3;
- SELECT @parameter;
- END CASE ;
- END ;
- $$
- DELIMITER ;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。