web-dev-qa-db-ja.com

MySQLストアドプロシージャの戻り値

値が有効かどうかを返す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
17
Juanma

ストアドプロシージャを正しく実行しましたが、valido変数を適切に参照していないと思います。私はいくつかの例を見ていて、このようなパラメータの前に@記号を付けました@Valido

この文 SELECT valido;は次のようになりますSELECT @valido;

このリンクを見てください mysql stored-procedure:out parameter 。 7回の投票による解決策に注目してください。彼はパラメーターを@記号で参照しているため、パラメーターの有効性の前に@記号を追加することをお勧めします

それがあなたの役に立つことを願っています。投票して、回答としてマークする場合。そうでない場合は、教えてください。

22
mfredy

追加:

  • 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;
6
biniam

SPを更新し、 declare handler with get 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
2
Rishi Vedpathak