web-dev-qa-db-fra.com

MySQL: @ variable vs variable. Quelle est la différence?

Dans une autre question, j'ai posté quelqu'un qui m'a dit qu'il y a une différence entre:

@variable

et:

variable

en MySQL. Il a également mentionné comment MSSQL a une portée de traitement par lots et MySQL, une portée de session. Quelqu'un peut-il élaborer sur cela pour moi?

484
triplethreat78

MySQL a le concept de variables définies par l'utilisateur.

Ce sont des variables faiblement typées qui peuvent être initialisées quelque part dans une session et conservent leur valeur jusqu'à la fin de la session.

Ils sont précédés du signe @, comme ceci: @var

Vous pouvez initialiser cette variable avec une instruction SET ou dans une requête:

SET @var = 1

SELECT @var2 := 2

Lorsque vous développez une procédure stockée dans MySQL, vous pouvez transmettre les paramètres d'entrée et déclarer les variables locales:

DELIMITER //

CREATE PROCEDURE prc_test (var INT)
BEGIN
    DECLARE  var2 INT;
    SET var2 = 1;
    SELECT  var2;
END;
//

DELIMITER ;

Ces variables ne sont précédées d'aucun préfixe.

La différence entre une variable de procédure et une variable définie par l'utilisateur spécifique à la session réside dans le fait que la variable de procédure est réinitialisée sur NULL à chaque appel de la procédure, alors que la variable spécifique à la session n'est pas:

CREATE PROCEDURE prc_test ()
BEGIN
    DECLARE var2 INT DEFAULT 1;
    SET var2 = var2 + 1;
    SET @var2 = @var2 + 1;
    SELECT  var2, @var2;
END;

SET @var2 = 1;

CALL prc_test();

var2  @var2
---   ---
2     2


CALL prc_test();

var2  @var2
---   ---
2     3


CALL prc_test();

var2  @var2
---   ---
2     4

Comme vous pouvez le constater, var2 (variable de procédure) est réinitialisé à chaque appel de la procédure, alors que @var2 (variable spécifique à la session) ne l’est pas.

(En plus des variables définies par l'utilisateur, MySQL contient également des "variables système" prédéfinies, qui peuvent être des "variables globales" telles que @@global.port ou "variables de session" tels que @@session.sql_mode; ces "variables de session" ne sont pas liées aux variables définies par l'utilisateur spécifiques à la session.)

608
Quassnoi

Dans MySQL, @variable indique une variable définie par l'utilisateur . Vous pouvez définir le vôtre.

SET @a = 'test';
SELECT @a;

En dehors des programmes stockés, un variable, sans @, est un variable système , que vous ne pouvez pas définir vous-même.

La portée de cette variable est la session entière. Cela signifie que tant que votre connexion avec la base de données existe, la variable peut toujours être utilisée.

Cela contraste avec MSSQL, où la variable ne sera disponible que dans le lot de requêtes actuel (procédure stockée, script ou autre). Il ne sera pas disponible dans un autre lot lors de la même session.

69
molf

MSSQL exige que les variables des procédures soient DECLAREd et que les utilisateurs utilisent la syntaxe @Variable (DECLARE @TEXT VARCHAR (25) = 'text'). En outre, MS autorise les déclarations dans n'importe quel bloc de la procédure, contrairement à MySQL qui requiert tous les DECLARE en haut.

Bien qu'en ligne de commande, l'utilisation de "set = @variable" dans les procédures stockées dans MySQL présente des risques. Il n'y a pas de portée et les variables vivent à travers les limites de la portée. Ceci est similaire aux variables en JavaScript déclarées sans le préfixe "var", qui sont alors l'espace de noms global et créent des collisions et des écrasements inattendus.

J'espère que les collaborateurs de MySQL autoriseront DECLARE @Variable à différents niveaux de bloc au sein d'une procédure stockée. Remarquez le @ (arobase). Le préfixe @ sign aide à séparer les noms de variable des noms de colonne de table, car ils sont souvent identiques. Bien sûr, on peut toujours ajouter un préfixe "v" ou "l_", mais le signe @ est un moyen pratique et succinct de faire en sorte que le nom de la variable corresponde à la colonne à partir de laquelle vous pourriez extraire les données sans la masquer.

MySQL est nouveau dans les procédures stockées et ils ont fait du bon travail pour leur première version. Ce sera un plaisir de voir où ils prendront forme ici et de regarder les aspects du langage côté serveur mûrir.

10
Xybo

En principe, j'utilise UserDefinedVariables (précédé de @) dans les procédures stockées. Cela facilite la vie, surtout lorsque j'ai besoin de ces variables dans deux ou plusieurs procédures stockées. Au moment où j’ai besoin d’une variable uniquement dans ONE Stored Procedure, j’utilise une variable système (sans préfixe @).

@Xybo: Je ne comprends pas pourquoi l'utilisation de @ variables dans StoredProcedures devrait être risquée. Pourriez-vous s'il vous plaît expliquer "portée" et "limites" un peu plus facile (pour moi en tant que newbe)?

3
Peter