2013-11-22 3 views
0

Я не могу понять, почему :(Почему моя процедура не работает?

я должен обновить продукты таблицы, когда я вызываю процедуру с параметрами (reference_requested, quantity_requested) и «возвращение» (не, как это сделать, я прочитал о возвращении и Params в, из и 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

Где вы устанавливаете инициатор al значение для 'количество'? –

+0

Что говорит об ошибке? –

+0

Ошибка Sintax в параметрах – user3006912

ответ

0

Edit: Как было отмечено в комментариях, вы не можете вернуть значение (или используйте оператор return) в процедуре. Если вы хотите сделать это, тогда вы должны использовать «create function», а не «create procedure» и дополнительно указать тип данных возврата.

В вашем «else» оператор «return quantity» должен быть последним, прямо перед «end if» или обновление не будет работать.

+0

Хранимые процедуры не имеют оператора 'RETURN', только хранимые функции. –

+0

Спасибо, что указали, что я просто заметил логическую ошибку. Я пытался запустить это в sqlfiddle и не смог его скомпилировать в любом случае, но я не смог окончательно определить, что такое DB и версия для этого. Больше всего парня Postgres/Oracle в целом и из моих дней оракула нашло процедуры более неприятными, чем что-либо, и в основном прекратило писать их в пользу функций. Извините за отсутствие очевидного. –

0
... 
    create procedure compra(reference_requested varchar(50), quantity_requested int) 
    ... 
  • ли утверждение:
... 
    where reference_requested = reference; 
    ... 

reference_requested относится к параметру или столбца в таблице ?. Избегайте имен , параметры/переменные равны столбцам таблиц, это может привести к проблемам .

... 
    return quantity; 
    ... 

используется в функции для хранимой процедуры не используется.

0
  1. Для возврата значения из хранимой процедуры используйте параметр OUT.
  2. Помимо упомянутых выше проблем вы не можете просто произвольно обратиться в столбец 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; 

Здесь is SQLFiddle demo

+0

@ user3006912 Помогло ли это? Вам нужна дополнительная помощь по вашему вопросу? – peterm

Смежные вопросы