Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sử dụng tập kết quả CHỌN để chạy truy vấn CẬP NHẬT với Thủ tục được lưu trữ trong MySQL

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NHÓM THEO CÓ HAVING (DISTINCT):PHP, MYSQL

  2. Làm thế nào để có mysqldump với UTF8?

  3. Làm cách nào để sắp xếp kết quả truy vấn theo khoảng cách trong gói Laravel QueryBuilder / MySQL Spatial?

  4. mysql không tôn trọng cài đặt wait_timeout trong my.cnf

  5. Lỗi MySQL 1153 - Có gói lớn hơn byte 'max_allowed_packet'