MySQL có khái niệm về biến do người dùng xác định .
Chúng là các biến được nhập lỏng lẻo có thể được khởi tạo ở đâu đó trong một phiên và giữ nguyên giá trị của chúng cho đến khi phiên kết thúc.
Chúng được thêm vào trước bằng @
ký tên, như thế này:@var
Bạn có thể khởi tạo biến này bằng SET
câu lệnh hoặc bên trong một truy vấn:
SET @var = 1
SELECT @var2 := 2
Khi bạn phát triển một thủ tục được lưu trữ trong MySQL, bạn có thể chuyển các tham số đầu vào và khai báo các biến cục bộ:
DELIMITER //
CREATE PROCEDURE prc_test (var INT)
BEGIN
DECLARE var2 INT;
SET var2 = 1;
SELECT var2;
END;
//
DELIMITER ;
Các biến này không được thêm vào trước bất kỳ tiền tố nào.
Sự khác biệt giữa biến thủ tục và biến do người dùng xác định theo phiên cụ thể là biến thủ tục được khởi động lại thành NULL
mỗi khi thủ tục được gọi, trong khi biến phiên cụ thể thì không:
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
Như bạn thấy, var2
(biến thủ tục) được khởi động lại mỗi khi thủ tục được gọi, trong khi @var2
(biến theo phiên cụ thể) thì không.
(Ngoài các biến do người dùng xác định, MySQL còn có một số "biến hệ thống" được xác định trước, có thể là "biến toàn cục", chẳng hạn như @@global.port
hoặc "biến phiên" chẳng hạn như @@session.sql_mode
; các "biến số phiên" này không liên quan đến các biến số phiên cụ thể do người dùng xác định.)