web-dev-qa-db-fra.com

Variables locales MySQL

J'essaie de définir et d'initialiser une variable MySQL pour une requête.

J'ai ce qui suit:

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

J'utilise MySQL dans Netbeans et cela me dit que j'ai une erreur. Quelle est/où est mon erreur?

Comment puis-je réparer cela?

27
CodeKingPlusPlus

MySQL a deux types de variables différents:

  • variables locales (qui ne le sont pas préfixé par @) sont fortement typés et étendus au bloc de programme stocké dans lequel ils sont déclarés. Notez que, comme indiqué sous DECLARE Syntaxe :

    DECLARE n'est autorisé qu'à l'intérieur d'un BEGIN ... END instruction composée et doit être à son début, avant toute autre instruction.

  • variables utilisateur (lesquelles sont préfixées par @) sont lâchement saisis et étendus à la session. Notez qu'ils ne doivent ni ne peuvent être déclarés - utilisez-les directement.

Par conséquent, si vous définissez un programme stocké et souhaitez réellement une "variable locale", selon le libellé de votre question, vous devrez supprimer le @ et assurez-vous que votre instruction DECLARE se trouve au début de votre bloc de programme. Sinon, pour utiliser une "variable utilisateur", supprimez l'instruction DECLARE.

De plus, vous devrez soit entourer votre requête entre parenthèses afin de l'exécuter en tant que sous-requête:

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

Sinon, vous pouvez utiliser SELECT ... INTO :

SELECT COUNT(*) INTO @countTotal FROM nGrams;
41
eggyal

Essaye ça:-

 select @countTotal := COUNT(*) from nGrams;
6
Rahul Tripathi

Exemple de fonction:

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 ;
2
alditis

Selon DECLARE Syntax , declare doit être à l'intérieur d'un bloc begin ... end.

1
Olaf Dietsche