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,而使用者自定義變數則不會。