En otra pregunta que publiqué, alguien me dijo que hay una diferencia entre:
@variable
y:
variable
en MySQL También mencionó cómo MSSQL tiene alcance por lotes y MySQL tiene alcance de sesión. ¿Alguien puede dar más detalles sobre esto por mí?
Respuestas:
MySQL
tiene el concepto de variables definidas por el usuario .Son variables poco escritas que pueden inicializarse en algún lugar de una sesión y mantener su valor hasta que finalice la sesión.
Están antepuestos con un
@
signo, como este:@var
Puede inicializar esta variable con una
SET
declaración o dentro de una consulta:Cuando desarrolla un procedimiento almacenado en
MySQL
, puede pasar los parámetros de entrada y declarar las variables locales:Estas variables no se anteponen con ningún prefijo.
La diferencia entre una variable de procedimiento y una variable definida por el usuario específica de sesión es que la variable de procedimiento se reinicia
NULL
cada vez que se llama al procedimiento, mientras que la variable específica de sesión no es:Como puede ver,
var2
(variable de procedimiento) se reinicia cada vez que se llama al procedimiento, mientras que@var2
(variable específica de la sesión) no.(Además de las variables definidas por el usuario, MySQL también tiene algunas "variables del sistema" predefinidas, que pueden ser "variables globales" como
@@global.port
"variables de sesión" como@@session.sql_mode
; estas "variables de sesión" no están relacionadas con las definidas por el usuario específicas de la sesión variables.)fuente
SELECT @@version;
por ejemplo. Esta es también una razón por la cual usarDELIMITER @@
no es realmente una buena idea.@
vs no?:=
y=
, y es que:=
funciona como un operador de asignación variable en todas partes, mientras que=
solo funciona de esa manera en lasSET
declaraciones, y es un operador de comparación en todas partes. PorSELECT @var = 1 + 1;
lo tanto , dejará @var sin cambios y devolverá un valor booleano (1 o 0 según el valor actual de @var), mientrasSELECT @var := 1 + 1;
que cambiará @var a 2 y devolverá 2.En MySQL,
@variable
indica una variable definida por el usuario . Puedes definir el tuyo.Fuera de los programas almacenados, a
variable
, sin@
, es una variable del sistema , que no puede definir usted mismo.El alcance de esta variable es toda la sesión. Eso significa que mientras exista su conexión con la base de datos, la variable aún puede usarse.
Esto está en contraste con MSSQL, donde la variable solo estará disponible en el lote actual de consultas (procedimiento almacenado, secuencia de comandos u otro). No estará disponible en un lote diferente en la misma sesión.
fuente
SET @@a = 'test';
, cf. dev.mysql.com/doc/refman/5.1/en/set-statement.html@@
. Por ejemplo,set@@my_var=1
,set@@session.my_var=1
, yset session my_var=1
que no funciona porquemy_var
no es un sistema de variables, mientras que nosotros podemos hacerset@@big_tables=1
,set@@session.big_tables=1
yset session big_tables=1
porquebig_tables
es una variable del sistema.var2
es una variable sin@
prefijo, pero no es una variable del sistema: es una variable de procedimiento. Esto está permitido porque está en un procedimiento almacenado (también conocido como programa almacenado). Fuera de los procedimientos almacenados, una variable sin@
es una variable del sistema.MSSQL requiere que las variables dentro de los procedimientos se DECLAREn y la gente use la sintaxis @Variable (DECLARE @TEXT VARCHAR (25) = 'text'). Además, MS permite declaraciones dentro de cualquier bloque en el procedimiento, a diferencia de mySQL que requiere todos los DECLAROS en la parte superior.
Si bien es bueno en la línea de comandos, creo que usar el "set = @variable" dentro de los procedimientos almacenados en mySQL es arriesgado. No hay alcance y las variables viven a través de los límites del alcance. Esto es similar a las variables en JavaScript que se declaran sin el prefijo "var", que luego son el espacio de nombres global y crean colisiones y sobrescrituras inesperadas.
Espero que las buenas personas en mySQL permitan DECLARE @Variable en varios niveles de bloque dentro de un procedimiento almacenado. Observe la @ (en el signo). El prefijo de signo @ ayuda a separar los nombres de las variables de los nombres de las columnas de la tabla, ya que a menudo son los mismos. Por supuesto, siempre se puede agregar un prefijo "v" o "l_", pero el signo @ es una forma práctica y sucinta de hacer que el nombre de la variable coincida con la columna de la que podría estar extrayendo los datos sin bloquearla.
MySQL es nuevo en los procedimientos almacenados y han hecho un buen trabajo para su primera versión. Será un placer ver dónde lo toman aquí y ver cómo maduran los aspectos del lenguaje del lado del servidor.
fuente
En principio, uso UserDefinedVariables (antepuesto con @) dentro de Procedimientos almacenados. Esto facilita la vida, especialmente cuando necesito estas variables en dos o más procedimientos almacenados. Justo cuando necesito una variable solo dentro de UN procedimiento almacenado, entonces uso una variable del sistema (sin anteponer @).
@Xybo: No entiendo por qué usar @variables en StoredProcedures debería ser riesgoso. ¿Podría explicar un poco más el "alcance" y los "límites" (para mí como un novato)?
fuente
@@GLOBAL
variables son aún más "globales" e insidiosas. ¡Cruzan sesiones!@variables
tienen "alcance de sesión", por lo que al menos permanecen confinados de esa manera. Sin embargo, en cualquier lenguaje normal, eso es lo que usted llama alcance "global" (cuando cruzan funciones, etc.). El concepto MySQL de "global" quizás debería llamarse "universal", ya que se extiende más allá de los límites del proceso que lo ejecuta. Un "global" normalmente no puede hacer eso en un lenguaje estándar, ya que los procesos no comparten espacio de memoria. Esto se deriva de la tendencia persistente (vs volátil) de SQL.