2014-11-05 32 views
10

Ich muss einen SP erstellen, der einen Wert zurückgibt, wenn es gültig ist oder nicht. Aber es gibt nichts zurück und ich weiß nicht warum?MySQL gespeicherte Prozedur Rückgabewert

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

Verwenden Sie [Ausnahmebehandlung] (http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html) in Ihrem SP. –

Antwort

12

Sie haben die gespeicherte Prozedur richtig gemacht, aber ich glaube, Sie haben nicht die valido Variable richtig verwiesen. Ich war auf der Suche auf einige Beispiele, und sie haben ein Symbol @ vor dem Parameter wie dieser SELECT valido; sollte wie dieses SELECT @valido;

Blick auf diesen Link mysql stored-procedure: out parameter sein @Valido

Diese Erklärung setzen. Beachten Sie die Lösung mit 7 Upvotes. Er hat den Parameter mit einem @ -Zeichen referenziert, daher habe ich vorgeschlagen, dass Sie vor Ihrem Parameter ein @ -Zeichen hinzufügen:

Ich hoffe, das funktioniert für Sie. wenn es stimmt, und markieren Sie es als die Antwort. Wenn nicht, sag es mir.

+1

das war das Problem an erster Stelle, thx sehr viel !! :) – Juanma

+0

Wenn Sie @ vor die Variable setzen, wird sie zu einer sitzungsspezifischen benutzerdefinierten Variable, was gut funktioniert. Sie können die Variable auch als DECLARE valido INT deklarieren. –

1

Aktualisieren Sie Ihre SP und behandeln Ausnahme darin mit declare handler mit get diagnostics, so dass Sie wissen, ob es eine Ausnahme gibt. z.B.

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

Was ist "GET DIAGNOSTICS CONDITION 1" hier? –

+0

Der MySQL 5.6-Parser sagt mir, dass die END-Anweisung für den SQLEXCEPTION-Handler-Block ein Semikolon benötigt und dass DECLARE dem Block vorangestellt sein muss, der den Handler deklariert. siehe "13.6.4.1 Lokale Variable DECLARE-Syntax" unter https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html. –

5

Anzahl:

  • DELIMITER am Anfang und Ende des SP.
  • TROPFENVERFAHREN, WENN EXISTEN validar_egreso; am Anfang
  • Verwenden Sie beim Aufruf des SP @variableName.

Das funktioniert für mich. (Ich habe einen Teil Ihres Skripts geändert, damit jeder es ohne Ihre Tabellen ausführen kann).

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; 
Verwandte Themen