2012-12-02 5 views
21

Ich versuche, eine MySQL-Variable für eine Abfrage zu definieren und zu initialisieren.MySQL lokale Variablen

Ich habe folgendes:

declare @countTotal int; 
SET @countTotal = select COUNT(*) 
from nGrams; 

ich MySQL in Netbeans verwende und es sagt mir, ich habe einen Fehler. Was/wo ist mein Fehler?

Wie kann ich das beheben?

Antwort

31

MySQL verfügt über zwei verschiedene Arten von variabel:

  • lokale Variablen (die nicht Präfix @) sind stark typisiert und auf den gespeicherten Programmblock beschränkt, in dem sie deklariert sind. Beachten Sie, dass, wie unter DECLARE Syntax dokumentiert:

    DECLARE nur innerhalb einer BEGIN ... END Compound-Anweisung zulässig und muss an seinem Anfang sein, vor allen anderen Anweisungen.

  • user variables (welche von @ Präfix) lose typisiert und auf die Sitzung scoped. Beachten Sie, dass sie weder — noch einfach verwendet werden können.

Deshalb, wenn Sie ein gespeichertes Programm definieren und tatsächlich einen „lokalen Variable“ wollen, gemäß dem Wortlaut in Ihrer Frage, werden Sie den @ Charakter fallen müssen und sicherzustellen, dass Ihre DECLARE Anweisung an das ist Start Ihres Programmblocks. Andernfalls, um eine "Benutzervariable" zu verwenden, löschen Sie die DECLARE Anweisung.

Darüber hinaus müssen Sie entweder Ihre Abfrage in Klammern, um umgeben sie als Unterabfrage auszuführen:

SET @countTotal = (SELECT COUNT(*) FROM nGrams); 

Oder könnten Sie verwenden SELECT ... INTO:

SELECT COUNT(*) INTO @countTotal FROM nGrams; 
5

Versuchen Sie folgendes: -

select @countTotal := COUNT(*) from nGrams; 
+0

Ich denke, dass Sie wahrscheinlich beabsichtigten, den [': =' Zuweisungsoperator] (http://dev.mysql.com/doc/en/assignment-operators.html#operator_assign-value) zu verwenden, anstatt den [' = "Gleichheitsoperator" (http://dev.mysql.com/doc/en/comparison-operators.html#operator_equal)? – eggyal

+0

Danke für dieses wichtige Update @eggyal –

2

Funktion Beispiel:

DROP FUNCTION IF EXISTS test; 

DELIMITER $$ 
CREATE FUNCTION test(in_number INT) RETURNS INT 
    BEGIN 
     DECLARE countTotal INT; 
     SET countTotal = SELECT COUNT(*) FROM nGrams; 
    RETURN countTotal + in_number; 
END $$ 
DELIMITER ; 
+0

seltsamerweise gibt es mir 0. Wenn ich eine Auswahl * Ich bekomme etwa 100.000 Zeilen ... – CodeKingPlusPlus

+0

Sie machen eine Funktion oder ein Verfahren? – alditis

+0

[Eine Unterabfrage muss immer in Klammern angezeigt werden.] (Https://dev.mysql.com/doc/en/subqueries.html) – eggyal

1

Nach DECLARE Syntax , declare muss innerhalb eines Anfangs- ... Endblocks sein.