Возвращаемое значение хранимой процедуры MySQL

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

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

Ответ 1

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

Этот оператор SELECT valido; должен выглядеть следующим образом: SELECT @valido;

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

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

Ответ 2

Добавить:

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

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

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;

Ответ 3

Обновите свой SP и обработайте исключение в нем с помощью объявить обработчик с get диагностики, чтобы вы знали, есть ли исключение. например.

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