这两天在学习存储过程,在条件语句 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 ;