Dans une autre question, j’ai posté quelqu’un m’a dit qu’il y avait une différence entre:
@variable
et:
variable
en MySQL. Il a également mentionné comment MSSQL a une scope par lot et que MySQL a une scope de session. Est-ce que quelqu’un peut élaborer sur ceci pour moi?
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 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 instruction SET
ou à l’intérieur d’une requête:
SET @var = 1 SELECT @var2 := 2
Lorsque vous développez une procédure stockée dans MySQL
, vous pouvez transmettre les parameters 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 à une session est que cette variable de procédure est réinitialisée à 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 voir, var2
(variable de procédure) est réinitialisée chaque fois que la procédure est appelée, tandis que @var2
(variable spécifique à la session) ne l’est pas.
(Outre les 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és aux variables définies par l’utilisateur spécifiques à la session.)
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, une variable
sans @
est une variable système que vous ne pouvez pas définir vous-même.
La scope de cette variable est la session entière. Cela signifie que tant que votre connexion à la firebase database 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 en cours (procédure stockée, script ou autre). Il ne sera pas disponible dans un lot différent dans la même session.
MSSQL exige que les variables dans les procédures soient DECLAREd et que les personnes utilisent la syntaxe @Variable (DECLARE @TEXT VARCHAR (25) = ‘text’). De plus, MS autorise les déclarations dans n’importe quel bloc de la procédure, contrairement à mySQL qui requirejs tous les DECLARE en haut.
Bien que bon sur la ligne de commande, je pense que l’utilisation de “set = @ varable” dans les procédures stockées dans mySQL est risquée. Il n’y a pas de scope et les variables vivent à travers les limites de la scope. 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 inattendues et des écrasements.
J’espère que les bonnes personnes de mySQL autoriseront DECLARE @Variable à différents niveaux de bloc dans une procédure stockée. Notez le @ (au signe). Le préfixe @ sign permet de séparer les noms de variables des noms de colonnes de tables, car ils sont souvent les mêmes. Bien sûr, on peut toujours append un préfixe “v” ou “l_”, mais le signe @ est un moyen pratique et concis de faire correspondre le nom de la variable à la colonne dont vous extrayez les données sans les écraser.
MySQL est nouveau pour 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 voir les aspects côté serveur de la langue mûrir.
En principe, j’utilise UserDefinedVariables (précédé de @) dans les procédures stockées. Cela facilite la vie, en particulier lorsque j’ai besoin de ces variables dans deux procédures stockées ou plus. Juste au moment où j’ai besoin d’une variable uniquement dans ONE Procédure stockée, 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 expliquer un peu plus facilement la “scope” et les “limites” (pour moi en tant que newbe)?