【问题标题】:Why doesn't my procedure work?为什么我的程序不起作用?
【发布时间】:2013-11-22 03:50:21
【问题描述】:

我不知道为什么:(

当我使用参数(reference_requested、quantity_requested)和“return”调用过程时,我必须更新表 products(我不知道如何做,我阅读了 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
&&

【问题讨论】:

  • quantity的初始值在哪里设置?
  • 错误说明了什么?
  • 参数中的语法错误
  • 数量是一个叫做 products 的表中的一个字段,我在里面插入了一些数据,应该将这些数据与参数进行比较
  • 只有存储的函数才能返回值 - dev.mysql.com/doc/refman/5.7/en/create-procedure.html.

标签: mysql sql stored-procedures if-statement


【解决方案1】:
   ...
   create procedure compra(reference_requested varchar(50), quantity_requested int)
   ...
  • 声明:
   ...
   where reference_requested = reference;
   ...

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

   ...
   return quantity;
   ...

用于存储过程的函数中不使用。

【讨论】:

    【解决方案2】:

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

    在你的“else”中,“return quantity”语句应该放在最后,就在“end if”之前,否则更新将不会运行。

    【讨论】:

    • 存储过程没有RETURN 语句,只有存储函数。
    • 感谢您指出这一点,我刚刚注意到逻辑错误。我试图在 sqlfiddle 中运行它,但在任何情况下都无法编译它,但我无法确定这是用于什么数据库和版本。一般来说,他更像是一个 Postgres/Oracle 人,从我的 oracle 时代开始,我发现程序比任何事情都更令人讨厌,并且基本上停止编写它们以支持函数。很抱歉错过了明显的内容。
    【解决方案3】:
    1. 要从存储过程返回值,请使用OUT 参数。
    2. 除了已经提到的问题之外,您不能随意解决products 表中的quantity 列。它应该在某些语句的上下文中使用(例如SELECT)。

    现在,您的程序的简化版本可能类似于

    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演示

    【讨论】:

    • @user3006912 有帮助吗?您的问题需要更多帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多