Computer >> Máy Tính >  >> Lập trình >> MySQL

Biến do người dùng xác định so với Biến cục bộ trong MySQL?

Biến do người dùng xác định còn được gọi là biến theo phiên cụ thể. Đây là một loại biến được nhập lỏng lẻo có thể được khởi tạo ở đâu đó trong phiên và chứa giá trị của biến do người dùng xác định cho đến khi phiên kết thúc.

Biến do người dùng xác định có tiền tố là ký hiệu @. Ví dụ:

@anyVariableName;

Có hai cách tiếp cận mà bạn có thể khởi tạo biến do người dùng xác định. Bạn có thể sử dụng lệnh SET hoặc sử dụng truy vấn CHỌN. Cách tiếp cận đầu tiên như sau:

SET @anyVariableName=anyValue;

Cách tiếp cận thứ hai như sau:

SELECT @anyVariableName :=anyValue;

Nếu bạn không sử dụng dấu hai chấm (:) trong truy vấn SELECT thì nó sẽ đánh giá nó dưới dạng biểu thức. Kết quả sẽ là true hoặc false:

mysql> select @m=10;

Sau đây là kết quả:

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

Biến cục bộ có thể được sử dụng trong thủ tục lưu trữ, hàm, v.v. Nó được sử dụng với từ khóa DECLARE. Không cần tiền tố @ như biến do người dùng xác định.

Cú pháp như sau đối với các biến cục bộ.

DECLARE yourVariableName dataType;

LƯU Ý :Sự khác biệt chính giữa biến cục bộ và biến do người dùng xác định là biến cục bộ được khởi động lại với giá trị NULL mỗi lần bất cứ khi nào thủ tục được lưu trữ được gọi trong khi biến dành riêng cho phiên hoặc biến do người dùng xác định không được khởi động lại bằng NULL. Người dùng khác không thể nhìn thấy biến do người dùng xác định do một người dùng đặt. Bất kỳ biến phiên nào cho một người dùng nhất định sẽ tự động bị hủy khi người dùng thoát.

Đây là bản demo của biến phiên cụ thể và biến cục bộ với thủ tục được lưu trữ. Truy vấn để tạo một thủ tục được lưu trữ với biến cục bộ và biến do người dùng xác định như sau:

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 ;

Bây giờ hãy đặt giá trị cho biến do người dùng xác định. Truy vấn như sau:

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

Bây giờ hãy gọi thủ tục đã lưu trữ. Trong lần gọi đầu tiên, biến do người dùng xác định sẽ là 10 + 10 =20 trong khi biến cục bộ sẽ là 10 + 10 =20.

Gọi thủ tục đã lưu trữ bằng lệnh gọi:

mysql> CALL sp_LocalAndUserDefinedVariableDemo();

Sau đây là kết quả:

+---------------+
| 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)

Trong lần gọi thứ hai, biến do người dùng xác định sẽ giữ giá trị 20 và thêm 10 như 20 + 10 =30 trong khi biến cục bộ lại được khởi động lại bằng 10 và thêm 10 như 10 + 10 =20.

Gọi thủ tục đã lưu trữ và kiểm tra kết quả đầu ra mẫu:

mysql> CALL sp_LocalAndUserDefinedVariableDemo();

Sau đây là kết quả:

+---------------+
| 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)

Trong lần gọi thứ ba, biến do người dùng xác định sẽ giữ giá trị 30 và thêm 10 như 30 + 10 =40 trong khi biến cục bộ được khởi động lại bằng 10 và thêm 10 như 10 + 10 =20.

Bây giờ bạn có thể nói rằng trong mọi thủ tục, biến cục bộ được khởi tạo lại với một số giá trị có thể là NULL hoặc một số giá trị khác như trong trường hợp của tôi, tôi đã cung cấp giá trị mặc định là 10. Điều này có nghĩa là nó đặt biến cục bộ với giá trị 10 trong mọi lệnh gọi thủ tục trong khi biến do người dùng xác định thì không.