Оператор case в хранимой процедуре - неизвестная системная переменная

Я пытаюсь использовать оператор case для обновления столбца на основе значения другого столбца. Моя таблица с именем 'rma' в MySQL выглядит следующим образом:

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 ответа

Решение

Попробуй это:

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 |

Синтаксис регистра правильный, но вы не можете изменить поле базы данных внутри оператора регистра, для этого необходимо использовать оператор обновления.

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

Вы можете изменить только локальные переменные внутри этого вида case.

Ваш типичный случай смешивания процедурной логики и логики запросов, распространенная ошибка при выполнении хранимых процедур.

Линия ==>

set ref_status_id = 0;

Вызывает ошибку. Вы лечите набор ref_status_id в качестве переменной, когда его столбец в таблице RMA.

Что вы пытаетесь сделать в этом заявлении? Поскольку проверка жестко закодированных значений 19 не соответствует тому, что вы пытаетесь сделать.

Другие вопросы по тегам