Оператор 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 не соответствует тому, что вы пытаетесь сделать.