2014-11-05 5 views
10

Мне нужно создать SP, который возвращает значение, если оно действительно или нет. Но он ничего не возвращает, и я не знаю, почему?Возвращаемое значение хранимой процедуры MySQL

CREATE DEFINER=`root`@`localhost` PROCEDURE `validar_egreso`(
    IN codigo_producto VARCHAR(100), 
    IN cantidad INT, 
    OUT valido INT(11) 
) 
BEGIN 
    DECLARE resta INT(11); 
    SET resta = 0; 

    SELECT (s.stock - cantidad) INTO resta 
    FROM stock AS s 
    WHERE codigo_producto = s.codigo; 

    IF (resta > s.stock_minimo) THEN 
     SET valido = 1; 
    ELSE 
     SET valido = -1; 
    END IF; 
    SELECT valido; 
END 
+0

Использование [обработка исключений] (http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html) в вашем SP. –

ответ

12

Вы правильно сделали хранимую процедуру, но я думаю, вы не ссылаться на переменную valido правильно. Я смотрел на некоторые примеры, и они поставили символ @ перед параметром, как этот @Valido

Это утверждение SELECT valido; должно быть, как это SELECT @valido;

Посмотрите на эту ссылку mysql stored-procedure: out parameter. Обратите внимание на решение с 7 upvotes. Он ссылается на параметр с знаком @, поэтому я предложил добавить знак @ перед вашим параметром valido

Я надеюсь, что это сработает для вас. если он проголосует и отмечает это как ответ. Если нет, скажите мне.

+1

это была проблема, во-первых, thx очень !! :) – Juanma

+0

Вставка @ infront переменной делает ее определяемой пользователем переменной, которая отлично работает. Вы также можете объявить переменную как 'DECLARE valido INT'. –

1

Обновите свой SP и обработайте исключение, используя declare handler с get diagnostics, чтобы вы знали, есть ли исключение. , например.

CREATE DEFINER=`root`@`localhost` PROCEDURE `validar_egreso`(
IN codigo_producto VARCHAR(100), 
IN cantidad INT, 
OUT valido INT(11) 
) 
BEGIN 
DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN 
    GET DIAGNOSTICS CONDITION 1 
    @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT; 
    SELECT @p1, @p2; 
END 
DECLARE resta INT(11); 
SET resta = 0; 

SELECT (s.stock - cantidad) INTO resta 
FROM stock AS s 
WHERE codigo_producto = s.codigo; 

IF (resta > s.stock_minimo) THEN 
    SET valido = 1; 
ELSE 
    SET valido = -1; 
END IF; 
SELECT valido; 
END 
+0

Что такое "GET DIAGNOSTICS CONDITION 1"? –

+0

Парсер MySQL 5.6 говорит мне, что в инструкции END блока обработчика SQLEXCEPTION требуется точка с запятой и что DECLARE должен предшествовать блоку, объявляющему обработчик. см. «13.6.4.1 Локальная переменная DECLARE Syntax», на странице https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html. –

5

Добавить:

  • DELIMITER в начале и в конце SP.
  • ПРОЦЕДУРА РАЗЛИЧИЯ, ЕСЛИ СУЩЕСТВУЕТ validar_egreso; в начале
  • При вызове SP используйте @variableName.

Это работает для меня. (Я модифицировал часть вашего скрипта, чтобы ЛЮБОЙ мог запустить его без наличия ваших таблиц).

DROP PROCEDURE IF EXISTS `validar_egreso`; 

DELIMITER $$ 

CREATE DEFINER='root'@'localhost' PROCEDURE `validar_egreso` (
    IN codigo_producto VARCHAR(100), 
    IN cantidad INT, 
    OUT valido INT(11) 
) 
BEGIN 

    DECLARE resta INT; 
    SET resta = 0; 

    SELECT (codigo_producto - cantidad) INTO resta; 

    IF(resta > 1) THEN 
     SET valido = 1; 
    ELSE 
     SET valido = -1; 
    END IF; 

    SELECT valido; 
END $$ 

DELIMITER ; 

-- execute the stored procedure 
CALL validar_egreso(4, 1, @val); 

-- display the result 
select @val; 
Смежные вопросы