Dans une autre question que j'ai postée, quelqu'un m'a dit qu'il y avait une différence entre:
@variable
et:
variable
dans MySQL. Il a également mentionné comment MSSQL a une portée de lot et MySQL a une portée de session. Quelqu'un peut-il m'expliquer cela?
Réponses:
MySQL
a le concept de variables définies par l'utilisateur .Ce sont des variables de type lâche qui peuvent être initialisées quelque part dans une session et conserver leur valeur jusqu'à la fin de la session.
Ils sont précédés d'un
@
signe, comme ceci:@var
Vous pouvez initialiser cette variable avec une
SET
instruction ou à l'intérieur d'une requête:Lorsque vous développez une procédure stockée dans
MySQL
, vous pouvez passer les paramètres d'entrée et déclarer les variables locales: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 est que la variable de procédure est réinitialisée à
NULL
chaque appel de la procédure, tandis que la variable spécifique à la session n'est pas:Comme vous pouvez le voir,
var2
(variable de procédure) est réinitialisée à chaque appel de la procédure, tandis que@var2
contrairement à (variable propre à la session).(En plus des variables définies par l'utilisateur, MySQL possède également des "variables système" prédéfinies, qui peuvent être des "variables globales" telles que
@@global.port
ou des "variables de session" telles que@@session.sql_mode
; ces "variables de session" ne sont pas liées aux définitions d'utilisateur spécifiques à la session variables.)la source
SELECT @@version;
par exemple. C'est aussi une raison pour laquelle l'utilisationDELIMITER @@
n'est pas vraiment une bonne idée.@
vs non?:=
et=
, et c'est que cela:=
fonctionne comme un opérateur d'affectation de variable partout, alors qu'il=
ne fonctionne que de cette façon dans lesSET
instructions, et est un opérateur de comparaison partout ailleurs. Donc,SELECT @var = 1 + 1;
va laisser @var inchangé et retourner un booléen (1 ou 0 selon la valeur actuelle de @var), tandis queSELECT @var := 1 + 1;
changera @var à 2 et retournera 2.Dans MySQL,
@variable
indique une variable définie par l' utilisateur . Vous pouvez définir le vôtre.En dehors des programmes stockés, a
variable
, sans@
, est une 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 bien que votre connexion à 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 actuel de requêtes (procédure stockée, script ou autre). Il ne sera pas disponible dans un lot différent dans la même session.
la source
SET @@a = 'test';
, cf. dev.mysql.com/doc/refman/5.1/en/set-statement.html@@
. Par exemple,set@@my_var=1
,set@@session.my_var=1
etset session my_var=1
ne fonctionnerait pas parce quemy_var
n'est pas un système variable alors que nous pouvons faireset@@big_tables=1
,set@@session.big_tables=1
etset session big_tables=1
parcebig_tables
est une variable système.var2
est une variable sans@
préfixe, mais ce n'est pas une variable système: c'est une variable de procédure. Ceci est autorisé car il se trouve dans une procédure stockée (aka programme stocké). En dehors des procédures stockées, une variable sans@
est une variable système.MSSQL requiert que les variables dans les procédures soient DECLAREd et les gens 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 nécessite tous les DECLARE en haut.
Bien que bon sur la ligne de commande, je pense que l'utilisation de "set = @variable" dans les procédures stockées dans mySQL est risquée. 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 bonnes personnes de mySQL permettront DECLARE @Variable à différents niveaux de bloc dans une procédure stockée. Remarquez le @ (au signe). Le préfixe @ sign permet de séparer les noms de variables des noms de colonnes de table - car ils sont souvent les mêmes. Bien sûr, on peut toujours ajouter un préfixe "v" ou "l_", mais le signe @ est un moyen pratique et succinct pour que le nom de la variable corresponde à la colonne dont vous pourriez extraire les données sans les encombrer.
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 prennent forme ici et de regarder les aspects côté serveur de la langue mûrir.
la source
En principe, j'utilise UserDefinedVariables (précédé de @) dans les procédures stockées. Cela rend la vie plus facile, surtout lorsque j'ai besoin de ces variables dans deux ou plusieurs procédures stockées. Juste au moment où j'ai besoin d'une variable uniquement dans UNE procédure stockée, j'utilise une variable système (sans @ ajouté).
@Xybo: Je ne comprends pas pourquoi l'utilisation de @variables dans StoredProcedures devrait être risquée. Pourriez-vous s'il vous plaît expliquer un peu plus facilement «portée» et «limites» (pour moi en tant que nouveau)?
la source
@@GLOBAL
variables sont encore plus «globales» et insidieuses. Ils traversent les sessions!@variables
ont "portée de session", donc au moins ils restent confinés de cette manière. Dans tout langage normal, c'est ce que vous appelez la portée "globale" (quand ils croisent des fonctions, etc.). Le concept MySQL de «global» devrait peut-être être appelé «universel», dans la mesure où il s'étend au-delà des limites du processus qui l'exécute. Un «global» ne peut normalement pas faire cela dans un langage standard, car les processus ne partagent pas l'espace mémoire. Cela découle de la tendance persistante (vs volatile) de SQL.