Vấn đề: Khai báo và sử dụng biến cục bộ trong Stored Procedure
Trong MySQL, biến cục bộ (DECLARE) chỉ dùng được bên trong BEGIN ... END của Stored Procedure/Function/Trigger.
Cú pháp
DECLARE variable_name data_type [DEFAULT default_value];
Ví dụ: Stored Procedure tính bình phương
DELIMITER //
CREATE PROCEDURE square_demo(IN Value INT)
BEGIN
DECLARE magicValue INT; -- Khai báo biến
SET magicValue = Value; -- Gán giá trị
SELECT CONCAT('Your Square Value=', magicValue * magicValue) AS Output;
END //
DELIMITER ;
Gọi procedure
CALL square_demo(15);
Kết quả
+-----------------------+
| Output |
+-----------------------+
| Your Square Value=225 |
+-----------------------+
Các lưu ý quan trọng
DECLAREphải đặt ngay sauBEGIN, trước mọi câu lệnh khác.- Biến cục bộ chỉ tồn tại trong phạm vi
BEGIN ... ENDhiện tại. - Khác với biến người dùng (user-defined variables)
@var– dùng ở đâu cũng được, không cần DECLARE, tồn tại suốt session. - Gán giá trị:
SET var = value;hoặcSELECT ... INTO var;. DELIMITER //thay đổi ký tự kết thúc câu lệnh để tránh xung đột với;bên trong procedure.
Ví dụ nâng cao: Biến trong cursor
CREATE PROCEDURE process_data()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE v_id INT;
DECLARE v_name VARCHAR(50);
DECLARE cur CURSOR FOR SELECT id, name FROM source_table;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_id, v_name;
IF done THEN LEAVE read_loop; END IF;
-- Xử lý v_id, v_name
END LOOP;
CLOSE cur;
END