1

我正在尝试使用 case 语句根据另一列的值更新一列。我在 MySQL 中名为“rma”的表如下:

ID    |    rma_number    |     serial_number     |    ref_status_id
1     |       9898       |         123456        |          19
2     |       7869       |         098768        |           3

这是我的存储过程:

CREATE DEFINER=`admin`@`localhost` PROCEDURE `delete_update_rma`(in selectedID int, in selectedRMAID int)
begin

declare rmaStatus int(5);

select ref_status_id into rmaStatus
from rma
where id = selectedRMAID;

case rmaStatus
when 19 then
set ref_status_id = 0;

end case;

delete from dropbox where id = selectedID;

end

当我尝试保存以创建过程时,我收到错误 #1193 - Unknown system variable 'ref_status_id'。

谁能帮我确定我的存储过程可能有什么问题?

4

3 回答 3

1

尝试这个:

CREATE DEFINER=`admin`@`localhost` PROCEDURE `delete_update_rma`(IN selectedID INT, IN selectedRMAID INT)
BEGIN

UPDATE rma
SET ref_status_id = 
  CASE ref_status_id
    WHEN 19 THEN 0 
    WHEN 3 THEN 2
    ELSE ref_status_id
  END
WHERE id = selectedRMAID;

DELETE FROM dropbox WHERE id = selectedID;

END

检查SQL FIDDLE 演示

输出

| ID | RMA_NUMBER | SERIAL_NUMBER | REF_STATUS_ID |
|----|------------|---------------|---------------|
|  1 |      12345 |         67898 |             0 |
|  2 |      45645 |         89056 |             2 |
于 2014-01-08T05:05:44.447 回答
0

case 语法是正确的,但是您不能在 case 语句中更改数据库字段,您需要为此使用 update 语句。

UPDATE rma 
SET    ref_status_id = 0 
WHERE  ref_status_id = 19 
       AND id = selectedrmaid; 

您只能在这种 case 语句中更改本地变量。

您的情况是混合过程和查询逻辑的典型案例,这是执行存储过程时的常见错误。

于 2014-01-08T03:16:35.167 回答
-1

线==>

set ref_status_id = 0;

导致错误。ref_status_id当它是 rma 表中的一列时,您将 set视为一个变量。

你想在那个案例陈述中做什么?由于检查硬编码值 19 似乎与您尝试执行的操作不一致。

于 2014-01-08T02:53:07.720 回答