2014-11-05 93 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;