Comprender las variables de sesión de MySQL, las variables locales y las variables globales
1.Clasificación de variables MySQL
Según diferentes alcances, se dividen en variables de usuario de sesión y variables locales .
Variables de usuario de sesión : el alcance es el mismo que el de las variables de sesión, solo válido para la sesión de conexión actual .
Variables locales : solo válidas en bloques de instrucciones BEGIN y END, las variables locales solo se pueden usar en procedimientos almacenados y funciones almacenadas.
Variables globales : variables integradas del sistema después de que el servidor MySQL comienza a ejecutarse.
2. Definición de variables
(1) Variables de sesión:
Según los estándares de codificación de MySQL, las variables de usuario en MySQL comienzan con "@" y se pueden distinguir de las palabras clave.
@varn @varc Variables de sesión de usuario:
mysql> set @varn=100,@varc='AAA';
Query OK, 0 rows affected (0.00 sec)
mysql> select @varn,@varc ;
+-------+-------+
| @varn | @varc |
+-------+-------+
| 100 | AAA |
+-------+-------+
1 row in set (0.00 sec)
mysql>
(2) Variables locales
loc_n loc_c, definido en el procedimiento almacenado, variables locales.
delimiter $$
create procedure pro_test_var()
BEGIN
DECLARE loc_n INTEGER ;
DECLARE loc_c varchar(10) ;
set loc_n=10;
set loc_c='BBB';
set @varn=1 ,@varc='CCC';
select @varn,@varc ;
select loc_n,loc_c ;
END
$$
Las variables de sesión del usuario se pueden llamar y modificar en el procedimiento almacenado. Efecto de ejecución:
mysql> call pro_test_var();
+-------+-------+
| @varn | @varc |
+-------+-------+
| 1 | CCC |
+-------+-------+
1 row in set (0.00 sec)
+-------+-------+
| loc_n | loc_c |
+-------+-------+
| 10 | BBB |
+-------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Las variables locales no se pueden consultar dentro de una sesión:
mysql> select loc_n,loc_c ;
ERROR 1054 (42S22): Unknown column 'loc_n' in 'field list'
mysql> select @varn,@varc ;
+-------+-------+
| @varn | @varc |
+-------+-------+
| 1 | CCC |
+-------+-------+
1 row in set (0.00 sec)
3. Restricciones de variables de sesión de usuario
(1) No se pueden crear parámetros de llamada a procedimiento almacenado
Al realizar la entrada de parámetros en un procedimiento almacenado, aparece un error de sintaxis.
crear procedimiento pro_test_callvar(en @varc varchar(10))
mysql> delimiter $$
mysql> create procedure pro_test_callvar(in @varc varchar(10))
-> BEGIN
-> DECLARE loc_n INTEGER ;
-> DECLARE loc_c varchar(10) ;
->
-> set loc_n=10;
-> set loc_c='BBB';
->
-> set @varn=1 ,@varc='CCC';
-> select @varn,@varc ;
-> select loc_n,loc_c ;
->
-> END
-> $$
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@varc varchar(10))
BEGIN
DECLARE loc_n INTEGER ;
DECLARE loc_c varchar(10) ;
se' at line 1
(2) No se puede utilizar para buscar
CREATE DEFINER=`root`@`%` PROCEDURE `pro_test_fetch_cursor`()
begin
#declare var_tel varchar(15);
declare done int default 0 ;
declare cur_tel cursor for select t.hm_detail from check_cmcc t order by t.hm_detail limit 10;
#游标结标志,必须在游标声明后声明!!!否则报错
declare continue handler for not found set done = 1 ;
#使用游标前打开游标
open cur_tel ;
#循环的标签名称,要和end loop 对应。
getloop : loop
# 将游标变量赋值到用户会话变量
fetch cur_tel into @var_tel ;
if done = 1
then leave getloop ;
end if ;
end loop getloop;
close cur_tel ;
end
Mensaje de error rápido:
Defina la variable local declare var_tel varchar(15), y podrá usar fetch.
CREATE DEFINER=`root`@`%` PROCEDURE `pro_test_fetch_cursor`()
begin
declare var_tel varchar(15);
declare done int default 0 ;
declare cur_tel cursor for select t.hm_detail from check_cmcc t order by t.hm_detail limit 10;
#游标结标志,必须在游标声明后声明!!!否则报错
declare continue handler for not found set done = 1 ;
#使用游标前打开游标
open cur_tel ;
#循环的标签名称,要和end loop 对应。
getloop : loop
fetch cur_tel into var_tel ;
if done = 1
then leave getloop ;
end if ;
end loop getloop;
close cur_tel ;
end
4. Variables globales
Proporcionado por el sistema, válido en toda la base de datos, uso: @@global.var_name
Nota:
Si es un nivel global, debe agregar global, si es un nivel de sesión, debe agregar una sesión, si no está escrito, el valor predeterminado es sesión.
-- 查看全局变量
show global variables;
SHOW GLOBAL VARIABLES LIKE '%sort%';
mysql> SHOW GLOBAL VARIABLES LIKE '%sort_buffer%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_sort_buffer_size | 1048576 |
| myisam_sort_buffer_size | 134217728 |
| sort_buffer_size | 4194304 |
+-------------------------+-----------+
3 rows in set (0.00 sec)
-- 查看某全局变量
select @@global.sort_buffer_size ;
Modificar variables globales:
mysql> select @@global.sort_buffer_size;
+---------------------------+
| @@global.sort_buffer_size |
+---------------------------+
| 8388608 |
+---------------------------+
1 row in set (0.00 sec)
mysql> set @@global.sort_buffer_size=4194304;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@global.sort_buffer_size;
+---------------------------+
| @@global.sort_buffer_size |
+---------------------------+
| 4194304 |
+---------------------------+
1 row in set (0.00 sec)
5. Comprensión variable
(1) Variables de usuario de sesión
Alcance: sesión actual
Ubicación de la definición: en cualquier lugar de la sesión
Sintaxis: agregue el símbolo @, no es necesario especificar un tipo
(2) Variables locales
Alcance: Defina el bloque del programa de principio a fin.
Posición de definición: de principio a fin. La primera declaración al final.
Sintaxis: Generalmente, no es necesario agregar @ y se debe especificar el tipo de datos.
(3) Variables globales
Alcance: cada vez que se inicia el servidor MySQL, a todas las variables globales se les asignarán valores iniciales, que son válidos para todas las sesiones (conexiones) y no se pueden reiniciar en todos los servidores.
Ubicación de la definición: Sistema integrado
Sintaxis: Agregar prefijo @@global