table: orders (Fields: customerNumber, status) requirement: accepts customer number and returns the total number of orders that were shipped, canceled, resolved, and disputed. more information: 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 //
I cannot resolve this issue, need help on this..
Local variables cannot be used by such way. Only user-defined variables allows inline assignement.
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. Why not simple
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;
?
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.