MySQL存储过程返回值

27

我需要创建一个存储过程,如果它有效则返回一个值,但它没有返回任何东西,我不知道原因是什么?

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

在你的存储过程中使用异常处理 - Rishi Vedpathak
3个回答

28

你已经正确地编写了存储过程,但我认为你没有正确引用 valido 变量。我看了一些示例,他们在参数前面加上了 @ 符号,像这样:@Valido

这个语句 SELECT valido; 应该像这样 SELECT @valido;

看看这个链接mysql stored-procedure: out parameter。注意到获得 7 个赞的解决方案,他用 @ 符号引用了参数,因此我建议您在参数 valido 前添加 @ 符号。

希望对您有用。如果有效,请投票并将其标记为答案。如果无效,请告诉我。


2
在变量前面加上@符号可以使其成为会话特定的用户定义变量,这样可以很好地工作。您还可以将变量声明为DECLARE valido INT - biniam
声明并传递OUT参数对我来说很有效。 - Fabio Martins

13

地址:

  • 在存储过程(SP)的开头和结尾加上DELIMITER
  • 在开始时加上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;

3

使用声明处理程序获取诊断信息更新您的SP并处理异常,以便您知道是否出现异常。

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

这里的“GET DIAGNOSTICS CONDITION 1”是什么? - Sohel Pathan
MySQL 5.6解析器告诉我,在SQLEXCEPTION处理程序块上的END语句需要一个分号,并且DECLARE必须在声明处理程序的块之前。请参见https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html中的“13.6.4.1本地变量DECLARE语法”。 - David A. Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接