2013-11-22 44 views
0

我不明白为什么:(为什么我的程序不工作?

我不得不更新表产品,当我调用过程的参数(reference_requested,quantity_requested)和“返回”(我不怎么做,我读到的回报,而params,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

你在哪里设置启动“数量”的值? – 2013-11-22 03:54:08

+0

错误说的是什么? –

+0

Sintax params中的错误 – user3006912

回答

0

编辑值:正如评论指出,你不能返回一个值(或在程序中使用return语句)如果你想这样做,那么你应该使用“create function”而不是“create procedure”并且另外指定一个返回数据类型

在您的“其他”中,“退货数量”声明应该是最后一个,就在“end if”之前,否则更新将不会运行。

+0

存储过程没有'RETURN'语句,只存储函数。 –

+0

感谢您指出,我只是注意到了逻辑错误。我试图在sqlfiddle中运行它,并且无论如何都无法编译它,但我无法确切地确定它的用途。一般来说,更多的是Postgres/Oracle的人,从我的oracle天中发现程序比任何事物都更令人讨厌,并且基本上停止写它们来支持函数。对不起,错过了明显的。 –

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

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

... 
    return quantity; 
    ... 

在用于存储过程所使用的功能不被使用。

0
  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 ; 

为了能够让你不得不使用变量用户

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

这里的OUT参数的值是SQLFiddle demo

+0

@ user3006912有帮助吗?你的问题需要更多帮助吗? – peterm

相关问题