#mysql #sql #stored-procedures
#mysql #sql #хранимые процедуры
Вопрос:
таблица: заказы (поля: номер клиента, статус) требование: принимает номер клиента и возвращает общее количество заказов, которые были отправлены, отменены, разрешены и оспорены. дополнительная информация: https://www.mysqltutorial.org/mysql-stored-procedures-return-multiple-values /
## I am trying to implement this requirement using case when. the code is below:
## using MySQLWorkBench
delimiter //
create procedure get_order_number_by_status(
in cnumber int
, out shipped int
, out cancelled int
, out resolved int
, out disputed int
)
begin
select case o.status ## Error: "select is not valid at this position for...
when 'Shipped' then shipped :=shipped 1
when 'Cancelled' then cancelled :=cancelled 1
when 'Resolved' then resolved :=resolved 1
when 'Disputed' then disputed :=disputed 1
else null
end
from customers c join orders o
on c.customernumber = o.customernumber
where c.customernumber = cnumber;
end //
Я не могу решить эту проблему, мне нужна помощь в этом..
Комментарии:
1. Похоже, это кандидат на нечто
VIEW
большее, чем хранимая процедура. На самом деле это всего лишь несколько простыхGROUP BY
вещей.2. Вы должны включить точный и полный текст ошибки в свой вопрос. MySQL часто точно указывает, где возникает проблема в других частях сообщения.
Ответ №1:
Локальные переменные не могут быть использованы таким образом. Только определяемые пользователем переменные допускают встроенное назначение.
create procedure get_order_number_by_status(
in cnumber int
, out shipped int
, out cancelled int
, out resolved int
, out disputed int
)
begin
select case o.status
when 'Shipped' then @shipped := @shipped 1
when 'Cancelled' then @cancelled := @cancelled 1
when 'Resolved' then @resolved := @resolved 1
when 'Disputed' then @disputed := @disputed 1
else null
end
from customers c join orders o
on c.customernumber = o.customernumber
CROSS JOIN (SELECT @shipped:=0, @cancelled:=0, @resolved:=0, @disputed:=0) init
where c.customernumber = cnumber;
SET shipped := @shipped;
SET cancelled := @cancelled;
SET resolved := @resolved;
SET disputed := @disputed;
end
PS. Почему не просто
create procedure get_order_number_by_status(
in cnumber int
, out shipped int
, out cancelled int
, out resolved int
, out disputed int
)
select SUM(o.status = 'Shipped'),
SUM(o.status = 'Cancelled'),
SUM(o.status = 'Resolved'),
SUM(o.status = 'Disputed')
INTO shipped, cancelled, resolved, disputed
from customers c join orders o
on c.customernumber = o.customernumber
where c.customernumber = cnumber
GROUP BY o.status;
?