web-dev-qa-db-fra.com

Valeur de retour de la procédure stockée MySQL

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
17
Juanma

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.

22
mfredy

Ajouter:

  • DELIMITER au début et à la fin du SP.
  • PROCÉDURE DE DÉPART SI EXISTE validar_egreso; au début
  • Lorsque vous appelez le SP, utilisez @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;
6
biniam

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
2
Rishi Vedpathak