MySQL存储过程的返回值

时间:2014-11-05 15:06:28

标签: mysql stored-procedures return-value

我必须创建一个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

3 个答案:

答案 0 :(得分:22)

您已正确完成存储过程,但我认为您没有正确引用valido变量。我正在查看一些示例,他们在参数之前添加了一个@符号,如@Valido

此声明SELECT valido;应与此SELECT @valido;

类似

请看这个链接mysql stored-procedure: out parameter。请注意7个upvotes的解决方案。他已使用@符号引用参数,因此我建议您在参数valido

之前添加@符号

我希望这对你有用。如果它确实投票并将其标记为答案。如果没有,请告诉我。

答案 1 :(得分:6)

添加:

  • DELIMITER在SP的开头和结尾。
  • DROP PROCEDURE IF EXISTS 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;

答案 2 :(得分:2)

使用declare handler get diagnostics更新您的SP并处理其中的异常,以便您知道是否存在异常。 e.g。

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