简体   繁体   English

存储过程中的 MySQL 案例:错误代码:1064

[英]MySQL case when in stored procedure: Error Code: 1064

table: orders (Fields: customerNumber, status) requirement: accepts customer number and returns the total number of orders that were shipped, canceled, resolved, and disputed.表:订单(字段:customerNumber,状态) 要求:接受客户编号并返回已发货、取消、已解决和有争议的订单总数。 more information: https://www.mysqltutorial.org/mysql-stored-procedures-return-multiple-values/更多信息: 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

fiddle 小提琴

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;

? ?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM