【问题标题】:Case statement in stored procedure - Unknown System Variable存储过程中的案例语句 - 未知系统变量
【发布时间】:2014-01-08 02:43:40
【问题描述】:

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

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

【问题讨论】:

  • 你确定ref_status_id 是一个声明的变量吗?如果您想更新一行,您可能必须找到另一种方法来完成该部分...

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


【解决方案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 |

【讨论】:

  • 这在小提琴中工作,但由于某种原因它没有正确更新 ref_status_id 的值。不管 ref_status_id 的原始值是多少,更新后的值都是 0。
  • @brandozz 不客气……你能用例子解释一下这个问题吗?
  • 在您在 SQL FIDDDLE DEMO 中的示例中,例如,如果我添加“where id = 2”,则该过程不起作用,但如果我添加“where id = 1”过程按预期将 ref_status_id 更改为 0。
  • 我的错,这只是发生在我身上,而不是在你的小提琴中。我又做了一些测试。我不确定到底是什么问题。
【解决方案2】:

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

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

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

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

【讨论】:

  • 所以摆脱我的 select 语句,只用更新语句填充 Case?
【解决方案3】:

线 ==>

set ref_status_id = 0;

导致错误。您将 set ref_status_id 视为 rma 表中的列时的变量。

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

【讨论】:

  • -1,您正在更正语句中没有错误的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多