DELIMITER //
CREATE PROCEDURE checkUser(IN in_email VARCHAR(80), IN in_password VARCHAR(50))
BEGIN
DECLARE tempId INT DEFAULT 0;
DECLARE tempName VARCHAR(50) DEFAULT NULL;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT id, name FROM users WHERE email = in_email AND password = in_password;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO tempId, tempName;
UPDATE users SET online = 1 WHERE id = tempId;
UNTIL done = 1 END REPEAT;
CLOSE cur;
SELECT tempName;
END //
DELIMITER ;
NB:Tôi chưa thử nghiệm cái này. Có thể MySQL không thích CẬP NHẬT đối với bảng mà nó hiện có con trỏ đang mở.
Tái bút:Bạn nên xem xét lại cách bạn đang lưu trữ mật khẩu .
Nhận xét lại về RETURN
so với OUT
so với tập hợp kết quả:
RETURN
chỉ được sử dụng trong các hàm được lưu trữ, không phải các thủ tục được lưu trữ. Các hàm được lưu trữ được sử dụng khi bạn muốn gọi quy trình trong một biểu thức SQL khác.
SELECT LCASE( checkUserFunc(?, ?) );
Bạn có thể sử dụng OUT
nhưng bạn phải khai báo một biến người dùng trước để chuyển làm tham số đó. Và sau đó, bạn phải chọn biến người dùng đó để nhận giá trị của nó.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Khi trả về tập hợp kết quả từ một thủ tục được lưu trữ, cách dễ nhất là sử dụng SELECT
truy vấn.