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

Mysql 为什么我的程序不起作用?,mysql,sql,stored-procedures,if-statement,Mysql,Sql,Stored Procedures,If Statement,我不明白为什么: 当我调用带有参数reference_requested、quantity_requested和return的过程时,我必须更新表products。我不知道如何做,我读过关于return和params in、out和inout的内容,但我不太了解售出的单位的价值 delimiter && create procedure compra (@reference_requested varchar, @quantity_requested int) begin i

我不明白为什么:

当我调用带有参数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
&&

编辑:正如注释中指出的,您不能在过程中返回值或使用return语句。如果您希望这样做,那么应该使用create函数而不是create过程,并另外指定一个返回数据类型

在您的else中,return quantity语句应该是最后一个,在end if之前,否则更新将不会运行

重要的是指出@quantity_requested和例程参数quantity_requested之间的差异是不同的变量

尝试:

... 创建程序压缩引用请求varchar50,数量请求int ... 声明是否: ... 其中reference_requested=reference; ... 请求的引用是指表?中的参数或列?。避免使用 参数/变量等于表的列,这可能导致 解决问题

这个: ... 退货数量; ... 在函数中使用,因为未使用存储过程

要从存储过程返回值,请使用OUT参数。 除了已经提到的问题之外,您不能在products表中任意处理quantity列。它应该在某些语句的上下文中使用,例如SELECT。 现在,您的过程的简化版本可能类似于

分隔符$$ 创建过程压缩 在_ref_请求的VARCHAR32中, 在_数量_请求的整数中, 输出结果INT 开始 声明数量INT默认为0; 设置数量= 选择数量 来自产品 其中reference=\u ref\u请求 限制1 ; 设置数量=如果数量>申请数量,申请数量,数量; 更新产品 设置数量=数量-数量 其中reference=\u ref\u请求; 设置_结果=数量; 结束$$ 定界符; 要获得OUT参数的值,必须使用用户变量

设置@result=NULL; 调用compra'REF001',25,@result; 选择@result;
这里是演示

您在哪里设置数量的初始值?错误是怎么说的?paramsquantity中的Tax error是一个名为products的表中的字段,我在其中插入了一些数据,支持将该数据与参数进行比较。存储函数可以返回值-。存储过程没有返回语句,仅存储函数。感谢您指出这一点,我刚刚注意到了逻辑错误。我试图在sqlfiddle中运行它,但在任何情况下都无法编译它,但我无法确定这是用于什么DB和版本的。一般来说,我更喜欢Postgres/Oracle,从我的Oracle时代起,我就发现过程比任何东西都更讨厌,基本上停止编写过程,转而使用函数。抱歉,遗漏了明显的内容。@user3006912有帮助吗?你的问题需要更多的帮助吗?