variable stored mysql sql variables

variables en mysql stored procedure



MySQL: @variable vs. variable. ¿Cual es la diferencia? (4)

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 elaborar sobre esto para mí?


En MySQL, @variable indica una variable definida por el usuario . Puedes definir el tuyo propio.

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

Fuera de los programas almacenados, una variable , sin @ , es una variable del sistema , que no puede definirse.

El alcance de esta variable es la sesión completa. Eso significa que mientras exista su conexión con la base de datos, la variable puede seguir utilizándose.

Esto contrasta 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.


En principio, utilizo UserDefinedVariables (añadido con @) dentro de los 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 el prefijo @).

@Xybo: No entiendo por qué usar @variables en StoredProcedures debería ser riesgoso. ¿Podría por favor explicar "alcance" y "límites" un poco más fácilmente (para mí como nuevo)?


MSSQL requiere que las variables dentro de los procedimientos sean DECLARADAS y la gente use la sintaxis de @Variable (DECLARE @TEXT VARCHAR (25) = ''text''). Además, MS permite declarar dentro de cualquier bloque en el procedimiento, a diferencia de mySQL que requiere todas las DECLARAS en la parte superior.

Si bien es bueno en la línea de comandos, creo que el uso de "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 son el espacio de nombres global y crean colisiones inesperadas y sobrescriben.

Espero que la buena gente en mySQL permita DECLARE @Variable en varios niveles de bloque dentro de un procedimiento almacenado. Observe el @ (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 tener que borrarlo.

MySQL es nuevo en los procedimientos almacenados y han hecho un buen trabajo para su primera versión. Será un placer ver a dónde lo llevan aquí y ver cómo los aspectos del lenguaje del servidor maduran.


MySQL tiene el concepto de variables definidas por el usuario .

Son variables tipificadas de forma flexible que pueden inicializarse en algún lugar de una sesión y mantener su valor hasta que finalice la sesión.

Se añaden con un signo @ , como este: @var

Puede inicializar esta variable con una instrucción SET o dentro de una consulta:

SET @var = 1 SELECT @var2 := 2

Cuando desarrolla un procedimiento almacenado en MySQL , puede pasar los parámetros de entrada y declarar las variables locales:

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

Estas variables no se añaden con ningún prefijo.

La diferencia entre una variable de procedimiento y una variable definida por el usuario específica de la sesión es que la variable de procedimiento se reinicializa a NULL cada vez que se llama al procedimiento, mientras que la variable específica de la sesión no es:

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

Como puede ver, var2 (variable de procedimiento) se reinicializa cada vez que se llama al procedimiento, mientras que @var2 (variable específica de la sesión) no lo es.

(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 o "variables de sesión" como @@session.sql_mode ; estas "variables de sesión "no están relacionadas con las variables definidas por el usuario específicas de la sesión.)