Entenda as variáveis de sessão do MySQL, variáveis locais e variáveis globais

Entenda as variáveis ​​de sessão do MySQL, variáveis ​​locais e variáveis ​​globais

1.Classificação de variáveis ​​MySQL

De acordo com diferentes escopos, elas são divididas em variáveis ​​de usuário de sessão e variáveis ​​locais .
Variáveis ​​de usuário de sessão : o escopo é o mesmo das variáveis ​​de sessão, válido apenas para a sessão de conexão atual .
Variáveis ​​locais : válidas apenas em blocos de instrução BEGIN e END, variáveis ​​locais só podem ser usadas em procedimentos armazenados e funções armazenadas.
Variáveis ​​globais : variáveis ​​integradas do sistema após o servidor MySQL começar a ser executado.

2. Definição de variável

(1) Variáveis ​​de sessão:

De acordo com os padrões de codificação do MySQL, as variáveis ​​de usuário no MySQL começam com um “@” e podem ser diferenciadas de palavras-chave.
@varn @varc Variáveis ​​de sessão do usuário:

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) Variáveis ​​locais

loc_n loc_c, definido no procedimento armazenado, variáveis ​​locais.

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
$$

Variáveis ​​de sessão do usuário podem ser chamadas e modificadas no procedimento armazenado. Efeito de execução:

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)

Variáveis ​​locais não podem ser consultadas dentro de uma sessão:

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. Restrições de variáveis ​​de sessão do usuário

(1) Não é possível criar parâmetros de chamada de procedimento armazenado

Ao inserir parâmetros em um procedimento armazenado, aparece um erro de sintaxe.

crie procedimento pro_test_callvar(em @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) Não pode ser usado para busca

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

Mensagem de erro de prompt:
Insira a descrição da imagem aqui
Defina a variável local declare var_tel varchar(15) e você pode 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. Variáveis ​​globais

Fornecido pelo sistema, válido em todo o banco de dados, uso: @@global.var_name
Obs:
Se for um nível global, é necessário adicionar global, se for um nível de sessão, é necessário adicionar sessão, se não for escrito, o padrão é sessão.

-- 查看全局变量 
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 ;

Modifique variáveis ​​globais:

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. Compreensão variável

(1) Variáveis ​​do usuário da sessão

Escopo: sessão atual
Local de definição: qualquer lugar na sessão
Sintaxe: adicione o símbolo @, não há necessidade de especificar um tipo

(2) Variáveis ​​locais

Escopo: Defina o bloco do programa do início ao fim.
Posição de definição: do início ao fim. A primeira instrução no final.
Sintaxe: Geralmente, não há necessidade de adicionar @ e o tipo de dados precisa ser especificado.

(3) Variáveis ​​globais

Escopo: Cada vez que o servidor MySQL for iniciado, todas as variáveis ​​globais receberão valores iniciais, que são válidos para todas as sessões (conexões) e não podem ser reiniciados entre servidores.
Local de definição: Sistema integrado
Sintaxe: Adicionar prefixo @@global

Acho que você gosta

Origin blog.csdn.net/qq_39065491/article/details/133011485
Recomendado
Clasificación