2016-08-15 8 views
0

Ich habe gerade begonnen, MySQL zu lernen und gespeicherte Prozeduren zu erstellen. Diese Prozedur funktioniert einwandfrei, wenn ich lokale Variablen verwende. Wenn ich versuche, eine Sitzungsvariable in meiner Prozedur zu verwenden, erhalte ich einen Syntaxfehler. Kann ich Sitzungsparameter nicht in Prozeduren verwenden und wenn nicht, wo kann ich sie verwenden?Verwenden von Sitzungsvariablen in einer gespeicherten Prozedur

DELIMITER $$ 
CREATE PROCEDURE myfirst() 
BEGIN 
DECLARE @counter INT DEFAULT 1; 
DECLARE @result VARCHAR(30); 
WHILE (counter < (SELECT count(*) FROM animals)) 
DO 
SET result= (SELECT name FROM animals WHERE id = counter); 
SELECT result; 
SET counter = counter + 1; 
END while; 

END$$ 
DELIMITER ; 

Antwort

0

können Sie Benutzervariablen verwenden (Session, wie Sie sie nennen), aber man kann sie nicht als gespeicherte Prozedur Parameter Definition mit einem @ Zeichen bestehen.

Auch eine nie DECLARE s Benutzervariablen mit DECLARE.

Also verwenden Sie sie einfach. Es gibt in deiner Sitzung. Das heißt, wenn Sie müssen.

Es wäre besser und besser lesbar und unterstützbar, nur Ihre gespeicherten Prozeduren mit den richtigen Parameternamen zu erstellen (ohne das @ Zeichen). Wie Sie Werte übergeben, ob mit einer Benutzervariablenreferenz oder nicht, liegt bei Ihnen.

Unabhängig, gespeicherte Prozessparameter können nicht in ihrer Signatur mit einem @ Zeichen erscheinen. Alle DECLARES müssen zuerst nach BEGIN (und nur mit lokalen Variablen nicht mit Benutzervariablen) geschehen.

DROP PROCEDURE IF EXISTS myfirst; 
DELIMITER $$ 
CREATE PROCEDURE myfirst() 
BEGIN 
    DECLARE LocalVar_Int INT DEFAULT 1; -- not used, just shown 
    DECLARE LocalVar_Varchar VARCHAR(30); -- not used, just shown 

    -- all the DECLARES must come first after BEGIN 
    -- and only for LOCAL VARS 

    SET @count=1; -- this is a User Variable 
    SET @result=''; -- this is a User Variable 
    WHILE (@counter < (SELECT count(*) FROM animals)) 
    DO 
    SET @result= (SELECT name FROM animals WHERE id = @counter); 
    SELECT @result; 
    SET @counter = @counter + 1; 
    END while; 

END$$ 
DELIMITER ; 
Verwandte Themen