私が投稿した別の質問で、次のような違いがあると誰かが言っていました:
@variable
そして:
variable
MySQL で。また、MSSQL にはバッチ スコープがあり、MySQL にはセッション スコープがあることにも言及しました。誰かこれについて詳しく説明してもらえますか?
ベストアンサー1
MySQLには次のような概念がありますユーザー定義変数。
これらは、セッション内のどこかで初期化され、セッションが終了するまで値を保持する、緩く型付けされた変数です。
次のように、先頭に記号が付きます@
。@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