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を追加