MySQL セッション変数、ローカル変数、グローバル変数を理解する

MySQL セッション変数、ローカル変数、グローバル変数を理解する

1.MySQL変数の分類

スコープの違いに応じて、それらはセッション ユーザー変数ローカル変数に分けられます
セッション ユーザー変数: スコープはセッション変数と同じで、現在の接続セッションに対してのみ有効です。
ローカル変数: BEGIN および END ステートメント ブロックでのみ有効です。ローカル変数はストアド プロシージャとストアド関数でのみ使用できます。
グローバル変数: MySQL サーバーの実行開始後のシステム組み込み変数。

2. 変数の定義

(1) セッション変数:

MySQL コーディング標準によれば、MySQL のユーザー変数は「@」で始まり、キーワードと区別できます。
@varn @varc ユーザーセッション変数:

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) ローカル変数

loc_n loc_c、ストアド プロシージャで定義されたローカル変数。

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

ユーザー セッション変数はストアド プロシージャ内で呼び出して変更できます。実行効果:

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)

ローカル変数はセッション内でクエリできません。

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. ユーザーセッション変数の制限

(1) ストアドプロシージャ呼び出しパラメータが作成できない

ストアド プロシージャで入力パラメータを作成すると、構文エラーが表示されます。

プロシージャ pro_test_callvar を作成します (@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) フェッチには使用できません

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

プロンプト エラー メッセージ:
ここに画像の説明を挿入します
ローカル変数を定義して var_tel varchar(15) を実行すると、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. グローバル変数

システムによって提供され、データベース全体で有効です。使用法: @@global.var_name
注:
グローバル レベルの場合はグローバルを追加する必要があり、セッション レベルの場合はセッションを追加する必要があります (書き込まれていない場合)。デフォルトはセッションです。

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

グローバル変数を変更します。

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. 変数の理解

(1) セッションユーザー変数

スコープ: 現在のセッション
定義場所: セッション内の任意の場所
構文: @ 記号を追加、タイプを指定する必要はありません

(2) ローカル変数

範囲:プログラムブロックの先頭から末尾までを定義
定義位置:先頭から末尾までの最初の文 構文
:通常は@を付ける必要はなく、データ型を指定する必要があります。

(3) グローバル変数

スコープ: MySQL サーバーが起動されるたびに、すべてのグローバル変数に初期値が割り当てられます。これはすべてのセッション (接続) に対して有効であり、サーバー間で再起動することはできません。
定義場所:組み込みシステム
構文:プレフィックス@@globalを追加

おすすめ

転載: blog.csdn.net/qq_39065491/article/details/133011485
おすすめ