MySQL中的使用者自定義變數與區域性變數?


使用者自定義變數也稱為會話特定變數。它是一種鬆散型別的變數,可以在會話中的某個位置初始化,並在會話結束之前包含使用者自定義變數的值。

使用者自定義變數以符號@為字首。例如

@anyVariableName;

您可以透過兩種方法初始化使用者自定義變數。您可以使用SET命令或使用SELECT查詢。第一種方法如下:

SET @anyVariableName=anyValue;

第二種方法如下:

SELECT @anyVariableName :=anyValue;

如果您在SELECT查詢中不使用冒號(:),則它會將其評估為表示式。結果將為真或假。

mysql> select @m=10;

以下是輸出:

+-------+
| @m=10 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

區域性變數可用於儲存過程、函式等。它與DECLARE關鍵字一起使用。不需要像使用者自定義變數那樣的@字首。

區域性變數的語法如下。

DECLARE yourVariableName dataType;

注意:區域性變數和使用者自定義變數之間的主要區別在於,每次呼叫儲存過程時,區域性變數都會重新初始化為NULL值,而會話特定變數或使用者自定義變數不會重新初始化為NULL。一個使用者設定的使用者自定義變數無法被其他使用者看到。給定使用者的任何會話變數在使用者退出時都會自動銷燬。

以下是帶有儲存過程的會話特定變數和區域性變數的演示。建立包含區域性變數和使用者自定義變數的儲存過程的查詢如下:

mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_LocalAndUserDefinedVariableDemo()
   -> BEGIN
   -> DECLARE localVariable int default 10;
   -> SET localVariable=localVariable+10;  
   -> SET @userVariable=@userVariable+10;
   -> SELECT localVariable;
   -> SELECT @userVariable;
   -> END;
   -> //
Query OK, 0 rows affected (0.39 sec)
mysql> DELIMITER ;

現在設定使用者自定義變數的值。查詢如下:

mysql> SET @userVariable=10;
Query OK, 0 rows affected (0.00 sec)

現在呼叫儲存過程。在第一次呼叫中,使用者自定義變數將為10+10=20,而區域性變數將為10+10=20。

使用call命令呼叫儲存過程

mysql> CALL sp_LocalAndUserDefinedVariableDemo();

以下是輸出:

+---------------+
| localVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.32 sec)
+---------------+
| @userVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.34 sec)
Query OK, 0 rows affected (0.36 sec)

在第二次呼叫中,使用者自定義變數將保持值為20,並加上10,例如20+10=30,而區域性變數將再次初始化為10,並加上10,例如10+10=20。

呼叫儲存過程並檢查示例輸出

mysql> CALL sp_LocalAndUserDefinedVariableDemo();

以下是輸出:

+---------------+
| localVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.00 sec)
+---------------+
| @userVariable |
+---------------+
|            30 |
+---------------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.02 sec)

在第三次呼叫中,使用者自定義變數將保持值為30,並加上10,例如30+10=40,而區域性變數將再次初始化為10,並加上10,例如10+10=20。

現在您可以說,在每次過程呼叫中,區域性變數都將使用某個值重新初始化,該值可能是NULL或其他值,在我的例子中,我提供了預設值10。這意味著它在每次過程呼叫中都將區域性變數設定為值10,而使用者自定義變數則不會。

更新於:2019年7月30日

1K+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告