为什么我的程序不起作用?

时间:2013-11-22 03:50:22

标签: mysql sql stored-procedures if-statement

我无法弄清楚原因:(

当我使用参数(reference_requested,quantity_requested)和“return”调用该过程时,我必须更新表产品(我不知道怎么做,我读到有关return和params in,out和inout,但我不太了解销售单位的价值

delimiter &&
create procedure compra (@reference_requested varchar, @quantity_requested int)
begin
  if quantity >= quantity_requested then
    update products
    set quantity = quantity - quantity_requested
    where reference_requested = reference;
    return quantity_requested;
  else
    return quantity;
    update products
    set quantity = 0;
    where reference_requested = reference;
  end if;
end
&&

3 个答案:

答案 0 :(得分:0)

编辑:正如评论中指出的那样,您不能在过程中返回值(或使用return语句)。如果您希望这样做,那么您应该使用“创建函数”而不是“创建过程”并另外指定返回数据类型。

在“else”中,“return quantity”语句应该是last end,就在“end if”之前,或者更新将不会运行。

答案 1 :(得分:0)

   ...
   create procedure compra(reference_requested varchar(50), quantity_requested int)
   ...
  • 声明:
   ...
   where reference_requested = reference;
   ...

reference_requested是指表中的参数或列?避免使用的名称    参数/变量等于表的列,这可能导致    问题。

   ...
   return quantity;
   ...

用于未使用存储过程的函数。

答案 2 :(得分:0)

  1. 要从存储过程返回值,请使用OUT参数。
  2. 除了已经提到的问题之外,您不能随意解决quantity表中的products列。它应该在某些陈述的上下文中使用(例如SELECT)。
  3. 现在,您的过程的简化版本可能类似于

    DELIMITER $$
    CREATE PROCEDURE compra
    (
      IN  _ref_requested VARCHAR(32), 
      IN  _qty_requested INT, 
      OUT _result INT
    )
    BEGIN
      DECLARE qty INT DEFAULT 0;
    
      SET qty = 
      (
        SELECT quantity
          FROM products
         WHERE reference = _ref_requested
         LIMIT 1
      );
    
      SET qty = IF(qty > _qty_requested, _qty_requested, qty);
    
      UPDATE products
         SET quantity = quantity - qty
       WHERE reference = _ref_requested;
    
      SET _result = qty;
    END$$
    DELIMITER ;
    

    为了能够获得OUT参数的值,您必须使用用户变量

    SET @result = NULL;
    CALL compra('REF001', 25, @result);
    SELECT @result;
    

    这是 SQLFiddle 演示