存储过程中的case语句 - 未知系统变量

时间:2014-01-08 02:43:40

标签: mysql sql stored-procedures sql-update case-expression

我正在尝试使用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'。

有人可以帮我识别我的存储过程可能出错吗?

3 个答案:

答案 0 :(得分: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 DEMO

<强>输出

| ID | RMA_NUMBER | SERIAL_NUMBER | REF_STATUS_ID |
|----|------------|---------------|---------------|
|  1 |      12345 |         67898 |             0 |
|  2 |      45645 |         89056 |             2 |

答案 1 :(得分:0)

案例语法是正确的,但是您无法更改案例语句中的数据库字段,您需要使用更新语句。

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

您只能在此类案例陈述中更改本地变量。

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

答案 2 :(得分:-1)

行==&gt;

set ref_status_id = 0;

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

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