回答:
それらは緩やかに型付けされた変数であり、セッションのどこかで初期化され、セッションが終了するまでその値を保持します。
次の@
ように、先頭に記号を付けます。@var
この変数は、SET
ステートメントまたはクエリ内で初期化できます。
SET @var = 1
SELECT @var2 := 2
でストアドプロシージャを開発する場合MySQL
、入力パラメータを渡してローカル変数を宣言できます。
DELIMITER //
CREATE PROCEDURE prc_test (var INT)
BEGIN
DECLARE var2 INT;
SET var2 = 1;
SELECT var2;
END;
//
DELIMITER ;
これらの変数の前にはプレフィックスがありません。
プロシージャ変数とセッション固有のユーザー定義変数の違いはNULL
、セッション固有の変数ではなく、プロシージャが呼び出されるたびにプロシージャ変数が再初期化されることです。
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
ご覧のとおり、var2
(プロシージャ変数)は呼び出されるたびに再初期化されますが、@var2
(セッション固有の変数)は呼び出されません。
(MySQL には、ユーザー定義変数に加えて、「グローバル変数」などの「グローバル変数」や、@@global.port
「セッション変数」などの事前定義された「システム変数」もあります@@session.sql_mode
。これらの「セッション変数」は、セッション固有のユーザー定義とは無関係です。変数。)
SELECT @@version;
。例を参照してください。これは理由でもありますが、使用するのDELIMITER @@
は本当に良い考えではありません。
@
か?
:=
と=
、それはそれで:=
いる間、どこでも可変代入演算子として働く=
だけでそのように動作するSET
文、および他のどこでも比較演算子です。そうSELECT @var = 1 + 1;
不変@varままとしながら、(@varの電流値に応じて1または0)ブール値を返しますSELECT @var := 1 + 1;
2に@var変わり、2返す
MySQLでは@variable
、ユーザー定義変数を示します。独自に定義できます。
SET @a = 'test';
SELECT @a;
ストアドプログラムの外では、はvariable
、なし@
で、システム変数であり、自分で定義することはできません。
この変数のスコープは、セッション全体です。つまり、データベースとの接続が存在している間も、変数を使用できます。
これは、変数が現在のクエリのバッチ(ストアドプロシージャ、スクリプトなど)でのみ使用できるMSSQLとは対照的です。同じセッションの別のバッチでは使用できません。
SET @@a = 'test';
、参照 dev.mysql.com/doc/refman/5.1/en/set-statement.html
@@
。たとえば、set@@my_var=1
、set@@session.my_var=1
、およびset session my_var=1
ので、動作しませんmy_var
ではありません、システム変数私たちにできるのに対し、set@@big_tables=1
、set@@session.big_tables=1
、およびset session big_tables=1
ので、big_tables
システム変数です。
var2
は、@
プレフィックスのない変数ですが、システム変数ではなく、プロシージャ変数です。ストアドプロシージャ(別名ストアドプログラム)内にあるため、これは許可されます。ストアドプロシージャの外で@
は、なしの変数はシステム変数です。
MSSQLでは、プロシージャ内の変数を宣言する必要があり、@ Variable構文を使用します(DECLARE @TEXT VARCHAR(25)= 'text')。また、MSは、最上位のすべてのDECLAREを必要とするmySQLとは異なり、プロシージャの任意のブロック内での宣言を許可します。
コマンドラインは適切ですが、mySQLのストアドプロシージャ内で "set = @variable"を使用するのは危険だと思います。スコープはなく、スコープの境界を越えて変数が存在します。これは、 "var"プレフィックスなしで宣言されているJavaScriptの変数に似ています。これはグローバルネームスペースになり、予期しない衝突と上書きを引き起こします。
mySQLの優れたスタッフが、ストアドプロシージャ内のさまざまなブロックレベルでDECLARE @Variableを許可することを期待しています。@(アットマーク)に注意してください。@記号の接頭辞は、変数名とテーブルの列名を区別するのに役立ちます-変数名は同じであることが多いためです。もちろん、いつでも「v」または「l_」接頭辞を追加できますが、@記号は、変数名を、データを抽出せずに抽出する列と一致させるための便利で簡潔な方法です。
MySQLはストアドプロシージャの新機能であり、最初のバージョンでは優れた機能を果たしています。彼らがここでそれをどこから取っているかを見て、言語のサーバー側の側面が成熟するのを見るのは喜びです。
原則として、私はストアドプロシージャ内でUserDefinedVariables(@を先頭に追加)を使用します。これにより、特に2つ以上のストアドプロシージャでこれらの変数が必要な場合に、作業が楽になります。1つのストアドプロシージャ内でのみ変数が必要なときは、システム変数を使用します(@を前に付けません)。
@Xybo:StoredProceduresで@variablesを使用することが危険である理由がわかりません。「スコープ」と「境界」について少し簡単に説明していただけますか(私にとっては初心者)。
@@GLOBAL
変数はさらに「グローバル」で油断ならないものになります。彼らはセッションを横断します! @variables
「セッションスコープ」があるため、少なくともそれらはそのように制限されたままです。ただし、「グローバル」スコープと呼ばれる通常の言語では(関数が交差する場合など)。MySQLの「グローバル」の概念は、それを実行するプロセスの境界を超えて拡張されるという点で、おそらく「ユニバーサル」と呼ばれるべきです。プロセスはメモリ空間を共有しないため、「グローバル」は通常、標準言語ではそれを行うことができません。これは、SQLの永続的な(揮発性に対する)傾向に起因します。