我无法弄清楚原因:(
当我使用参数(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
&&
答案 0 :(得分:0)
编辑:正如评论中指出的那样,您不能在过程中返回值(或使用return语句)。如果您希望这样做,那么您应该使用“创建函数”而不是“创建过程”并另外指定返回数据类型。
在“else”中,“return quantity”语句应该是last end,就在“end if”之前,或者更新将不会运行。
答案 1 :(得分:0)
重要的是要指出9.4. User-Defined Variables(@quantity_requested)和常规参数(quantity_requested)13.1.15. CREATE PROCEDURE and CREATE FUNCTION Syntax之间的差异,是不同的变量。
尝试:
...
create procedure compra(reference_requested varchar(50), quantity_requested int)
...
...
where reference_requested = reference;
...
reference_requested
是指表中的参数或列?避免使用的名称
参数/变量等于表的列,这可能导致
问题。
...
return quantity;
...
用于未使用存储过程的函数。
答案 2 :(得分:0)
OUT
参数。quantity
表中的products
列。它应该在某些陈述的上下文中使用(例如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 演示