Возвращаемое значение хранимой процедуры 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