Случай MySQL, когда в хранимой процедуре: Код ошибки: 1064

#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;
 

?