2014-11-05 91 views
10

我必须创建一个SP,它返回一个值,如果它是有效的。但它不会返回任何东西,我不知道,为什么?MySQL存储过程返回值

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 
+0

在SP中使用[异常处理](http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html)。 – 2014-11-05 16:56:54

回答

12

您已完成正确的存储过程,但我认为您没有正确引用valido变量。我一直在寻找一些例子,他们已经把一个@符号的参数之前这样@Valido

本声明SELECT valido;应该是这样的SELECT @valido;

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

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

+1

这是第一个问题,thx非常多! :) – Juanma 2014-11-06 01:38:43

+0

将变量的@ infront设置为特定于会话的用户定义变量,该变量正常工作。你也可以声明变量为'DECLARE valido INT'。 – 2015-12-02 15:40:36

1

更新您的SP并使用declare handlerget diagnostics处理异常,以便您知道是否有异常。 例如

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 
+0

什么是“GET DIAGNOSTICS CONDITION 1”? – 2017-09-12 09:45:32

+0

MySQL 5.6解析器告诉我SQLEXCEPTION处理程序块上的END语句需要分号,并且DECLARE必须位于声明处理程序的块之前。请参阅“13.6.4.1局部变量DECLARE语法”,位于https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html。 – 2018-01-18 23:39:28

5

地址:

  • DELIMITER在SP的开始和结束。
  • 删除程序如果存在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;