2016-06-28 3 views
1

Unten ist meine gespeicherte Prozedur. Es funktioniert gut, aber mein Problem ist, dass ich den Ausgabeparameter nicht als VARCHAR erhalten kann.Mysql Stored Proc liefert keinen VARCHAR out-Parameter

Der Teil, wo ich Problem habe, ist die Zuordnung von @curcName an den Out-Parameter op_resultMessage

BEGIN 
    SET op_resultMessage = @curcName; 
END; 

Hier ist die gespeicherte Prozedur.

CREATE DEFINER=`root`@`localhost` PROCEDURE `addCurriculum`( 
    IN p_curcName varchar(100), 
    IN p_description TEXT, 
    IN p_yearLevel VARCHAR(50), 
    IN p_syStart INT, 
    IN p_syEnd INT, 
    IN p_creator VARCHAR(50), 
    OUT op_resultMessage VARCHAR(50)) 
BEGIN 

    DECLARE curcName VARCHAR(20) ; 

    IF EXISTS 
     (SELECT @curcName := `name` 
     FROM curriculum 
     WHERE 
      yearLevel  =  p_yearLevel 
      AND syStart  =  p_syStart 
      AND syEnd  =  p_syEnd) 

    THEN -- 

    BEGIN 
     SET op_resultMessage = @curcName; 
    END; 

     ELSE 

      BEGIN 
       INSERT INTO curriculum(`name`, description, yearLevel, syStart, syEnd, creator) 
       VALUES(p_curcName,p_description,p_yearLevel,p_syStart,p_syEnd,p_creator); 
      END; 

    END IF; 

END 

Ich versuche, eine Nachricht zurück, wenn name

VORHANDEN So sollte es so etwas wie

SET op_resultMessage = @curcName 'already uses the school year and year level you're trying to insert'; 

Aber ich weiß nicht, gehen, wie man richtig und Werte zuweisen verketten. Ich bin immer noch verwirrt mit := SET und = Betreiber. Ich denke, da habe ich Probleme.

Wenn ich die Out-Parameter des Typen ein INT wie

OUT op_resultMessage VARCHAR(50) 

ändern weist dann eine Nummer op_resultMessage wie SET op_resultMessage = 1;

Es gibt die Nummer 1 als aus Parameterwert. Es wird einfach nicht mit Varchar funktionieren.

Also, wenn ich versuche, das Verfahren zu nennen

CALL `enrollmentdb`.`addCurriculum` 
('Test Curriculum ','Test ','Grade 1',2015,2016,'jordan',@outputMsg); 

SELECT @outputMsg; -- this doesn't return any value even if Grade 1, 2015 and 2016 exists 

ich Hilfe schätzen würde. Ich habe gerade erst mysql gelernt.

Danke.

Antwort

1
drop procedure if exists addCurriculum; 
delimiter $$ 
CREATE PROCEDURE `addCurriculum`( 
    IN p_curcName varchar(100), 
    IN p_description TEXT, 
    IN p_yearLevel VARCHAR(50), 
    IN p_syStart INT, 
    IN p_syEnd INT, 
    IN p_creator VARCHAR(50), 
    OUT op_resultMessage VARCHAR(50)) 
BEGIN 

    DECLARE curcName VARCHAR(20) ; 

    SELECT `name` into @curcName 
     FROM curriculum 
     WHERE 
      yearLevel  =  p_yearLevel 
      AND syStart  =  p_syStart 
      AND syEnd  =  p_syEnd 
      LIMIT 1; 
    -- Note change above. When selecting into a variable (or more than 1) 
    -- then 0 or 1 rows can come back max or an Error occurs 

    IF @curcName is not null then 
     SET op_resultMessage = @curcName; 
    ELSE 
     BEGIN 
      INSERT INTO curriculum(`name`, description, yearLevel, syStart, syEnd, creator) 
      VALUES(p_curcName,p_description,p_yearLevel,p_syStart,p_syEnd,p_creator); 
     END; 
     SET op_resultMessage = 'GEEZ I am right here'; -- Drew added this 
    END IF; 
END$$ 
delimiter ; 

Hinweis der Kommentar in der gespeicherten Prozedur, vor allem der Teil nur 0 oder 1 Zeilen Rückkehr sonst wird ein Fehler mit einem select into var Muster auftreten. Also LIMIT 1. Das kann die gewünschte Zeile sein oder nicht (Limit 1), aber genau dort ist es jetzt.

+1

Danke für die Hilfe. Als ich deine Antwort gesehen habe, wurde mir klar, dass ich unnötige Blöcke verwendet habe, wenn ich nur überprüfen kann, ob curcName null ist. Ich schätze es. Vielen Dank. – p3ace

+0

mein Vergnügen. Ich hoffe, dass Sie den 1-Zeilen-Max-Aspekt darauf auflösen. – Drew