在数据库中,游标(Cursor) 是一种用于逐行处理查询结果集的机制。它常用于存储过程、函数或脚本中,当你无法用一条 SQL 完成复杂逻辑时。
下面按概念 → 使用步骤 → 示例 → 注意事项来说明。
游标是查询结果集的指针,可以一行一行地读取、处理数据。
✅ 适合场景:
UPDATE / INSERT / SELECT 一次性完成❌ 不适合场景:
以 MySQL 为例(其他数据库类似):
CREATE TABLE employees (
id INT,
salary DECIMAL(10,2)
);
DELIMITER $$
CREATE PROCEDURE update_salary()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE emp_id INT;
DECLARE emp_salary DECIMAL(10,2);
-- 1. 声明游标
DECLARE cur CURSOR FOR
SELECT id, salary FROM employees;
-- 2. 声明结束条件
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 3. 打开游标
OPEN cur;
-- 4. 循环读取
read_loop: LOOP
FETCH cur INTO emp_id, emp_salary;
IF done = 1 THEN
LEAVE read_loop;
END IF;
-- 5. 处理逻辑
IF emp_salary < 5000 THEN
UPDATE employees
SET salary = salary * 1.1
WHERE id = emp_id;
END IF;
END LOOP;
-- 6. 关闭游标
CLOSE cur;
END$$
DELIMITER ;
DECLARE
CURSOR emp_cur IS
SELECT id, salary FROM employees;
v_id employees.id%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO v_id, v_salary;
EXIT WHEN emp_cur%NOTFOUND;
IF v_salary < 5000 THEN
UPDATE employees SET salary = salary * 1.1 WHERE id = v_id;
END IF;
END LOOP;
CLOSE emp_cur;
END;
DECLARE cur CURSOR FOR
SELECT id, salary FROM employees;
DECLARE @id INT, @salary DECIMAL(10,2);
OPEN cur;
FETCH NEXT FROM cur INTO @id, @salary;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @salary < 5000
BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE id = @id;
END
FETCH NEXT FROM cur INTO @id, @salary;
END
CLOSE cur;
DEALLOCATE cur;
✅ 优点:
❌ 缺点:
✅ 能用 SQL 就别用游标
例如上面的例子可以改成:
UPDATE employees
SET salary = salary * 1.1
WHERE salary < 5000;
✅ 必须用时:
| 数据库 | 游标支持 |
|---|---|
| MySQL | ✅ 存储过程 |
| Oracle | ✅ PL/SQL |
| SQL Server | ✅ T-SQL |
| PostgreSQL | ✅ PL/pgSQL |
如果你愿意,我可以:
你用的是 MySQL / Oracle / SQL Server / PostgreSQL 哪一种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。