MySQL: @variabile vs variabile. Qual è la differenza?

In un’altra domanda che ho postato qualcuno mi ha detto che c’è una differenza tra:

@variable 

e:

 variable 

in MySQL. Ha anche menzionato come MSSQL ha scope scope e MySQL ha scope di sessione. Qualcuno può approfondire questo per me?

MySQL ha il concetto di variabili definite dall’utente .

Sono variabili vagamente digitate che possono essere inizializzate da qualche parte in una sessione e mantengono il loro valore fino alla fine della sessione.

Sono preceduti da un segno @ , come questo: @var

È ansible inizializzare questa variabile con un’istruzione SET o all’interno di una query:

 SET @var = 1 SELECT @var2 := 2 

Quando sviluppi una procedura memorizzata in MySQL , puoi passare i parametri di input e dichiarare le variabili locali:

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

Queste variabili non sono precedute da alcun prefisso.

La differenza tra una variabile di procedura e una variabile definita dall’utente specifica della sessione è che la variabile di procedura viene reinizializzata su NULL ogni volta che viene chiamata la procedura, mentre la variabile specifica della sessione non è:

 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 

Come potete vedere, var2 (variabile di procedura) viene reinizializzata ogni volta che viene chiamata la procedura, mentre @var2 (variabile specifica della sessione) non lo è.

(Oltre alle variabili definite dall’utente, MySQL ha anche alcune “variabili di sistema” predefinite, che possono essere “variabili globali” come @@global.port o “variabili di sessione” come @@session.sql_mode ; queste “variabili di sessione” “non sono correlati alle variabili definite dall’utente specifiche della sessione.)

In MySQL, @variable indica una variabile definita dall’utente . Puoi definire il tuo.

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

Al di fuori dei programmi memorizzati, una variable , senza @ , è una variabile di sistema , che non è ansible definire.

Lo scopo di questa variabile è l’intera sessione. Ciò significa che mentre la connessione con il database esiste, la variabile può ancora essere utilizzata.

Ciò è in contrasto con MSSQL, in cui la variabile sarà disponibile solo nel batch di query corrente (stored procedure, script o altro). Non sarà disponibile in un altro batch nella stessa sessione.

MSSQL richiede che le variabili all’interno delle procedure siano DECLAREd e la gente usi la syntax @Variable (DECLARE @TEXT VARCHAR (25) = ‘testo’). Inoltre, MS consente di dichiarare all’interno di qualsiasi blocco della procedura, diversamente da mySQL che richiede tutti i DECLARE nella parte superiore.

Mentre sto bene sulla linea di comando, sento che usare “set = @variable” all’interno delle stored procedure in mySQL è rischioso. Non vi è alcun ambito e le variabili vivono attraverso i confini dell’ambito. Questo è simile alle variabili in JavaScript dichiarate senza il prefisso “var”, che sono quindi lo spazio dei nomi globale e creano collisioni e sovrascritture inaspettate.

Spero che i bravi ragazzi di mySQL consentiranno DECLARE @Variable a vari livelli di blocco all’interno di una stored procedure. Si noti @ (al segno). Il prefisso @ sign aiuta a separare i nomi delle variabili dai nomi delle colonne delle tabelle, poiché spesso sono gli stessi. Naturalmente, si può sempre aggiungere un prefisso “v” o “l_”, ma il segno @ è un modo pratico e sintetico per far corrispondere il nome della variabile alla colonna da cui si stanno estraendo i dati senza rovinarli.

MySQL è nuovo per le stored procedure e hanno fatto un buon lavoro per la loro prima versione. Sarà un piacere vedere dove prendono forma qui e guardare gli aspetti lato server della lingua maturi.

In linea di principio, utilizzo UserDefinedVariables (preceduto da @) all’interno di stored procedure. Ciò rende la vita più facile, soprattutto quando ho bisogno di queste variabili in due o più stored procedure. Proprio quando ho bisogno di una variabile solo all’interno di una procedura memorizzata, che uso una variabile di sistema (senza anteporre @).

@ Xybo: Non capisco perché usare @variables in StoredProcedures dovrebbe essere rischioso. Potresti spiegare un po ‘più facilmente “scope” e “boundaries” (per me come newbe)?