Je dois créer un SP qui retourne une valeur si elle est valide ou non. Mais il ne retourne rien et je ne sais pas, pourquoi?
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
Vous avez correctement effectué la procédure stockée, mais je pense que vous n'avez pas correctement référencé la variable valido
. Je regardais quelques exemples et ils ont mis un symbole @ avant le paramètre comme celui-ci @Valido
Cette déclaration SELECT valido;
devrait ressembler à ceci SELECT @valido;
Regardez ce lien procédure stockée mysql: paramètre out . Remarquez la solution avec 7 votes positifs. Il a référencé le paramètre avec un signe @, donc je vous ai suggéré d'ajouter un signe @ avant votre paramètre valido
J'espère que cela fonctionne pour vous. s'il vote et marquez-le comme réponse. Sinon, dites-moi.
Ajouter:
DELIMITER
au début et à la fin du SP.validar_egreso
; au début@variableName
.Cela fonctionne pour moi. (J'ai modifié une partie de votre script pour que TOUT LE MONDE puisse l'exécuter sans avoir vos tables).
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;
Mettez à jour votre SP et gérez-y l'exception à l'aide de declare handler with get diagnostics afin que vous sachiez s'il y a une exception. Ex.
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