我正在尝试使用 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 - 未知系统变量"ref_status_id"。
任何人都可以帮助我确定我的存储过程可能存在的问题吗?
试试这个:
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 小提琴演示
输出
| ID | RMA_NUMBER | SERIAL_NUMBER | REF_STATUS_ID |
|----|------------|---------------|---------------|
| 1 | 12345 | 67898 | 0 |
| 2 | 45645 | 89056 | 2 |
大小写语法是正确的,但是您不能更改 case 语句中的数据库字段,您需要为此使用更新语句。
UPDATE rma
SET ref_status_id = 0
WHERE ref_status_id = 19
AND id = selectedrmaid;
您只能在这种案例语句中更改本地变量。
这是混合过程逻辑和查询逻辑的典型情况,这是执行存储过程时的常见错误。
行 ==>
set ref_status_id = 0;
导致错误。当集合 ref_status_id
是 rma 表中的一列时,您将它视为变量。
在那个案例陈述中,你想做什么?由于检查硬编码值 19 似乎与您尝试执行的操作不一致。