温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Cursor游标如何使用

发布时间:2026-08-31 18:15:45 来源:亿速云 阅读:97 作者:小樊 栏目:数据库

在数据库中,游标(Cursor) 是一种用于逐行处理查询结果集的机制。它常用于存储过程、函数或脚本中,当你无法用一条 SQL 完成复杂逻辑时。

下面按概念 → 使用步骤 → 示例 → 注意事项来说明。


一、什么是游标(Cursor)

游标是查询结果集的指针,可以一行一行地读取、处理数据。

✅ 适合场景:

  • 需要对每一行做复杂判断或计算
  • 行与行之间有依赖关系
  • 无法用 UPDATE / INSERT / SELECT 一次性完成

❌ 不适合场景:

  • 能用一个 SQL 完成的操作(性能差)

二、游标使用的基本步骤(通用)

MySQL 为例(其他数据库类似):

  1. 声明游标
  2. 声明结束条件(NOT FOUND)
  3. 打开游标
  4. 循环读取数据
  5. 关闭游标

三、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 ;

四、Oracle 游标示例(PL/SQL)

显式游标

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;

五、SQL Server 游标示例

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;

✅ 必须用时:

  • 减少游标内数据量
  • 尽快关闭游标
  • 避免在游标中再嵌套 SQL

八、不同数据库对比

数据库 游标支持
MySQL ✅ 存储过程
Oracle ✅ PL/SQL
SQL Server ✅ T-SQL
PostgreSQL ✅ PL/pgSQL

如果你愿意,我可以:

  • ✅ 针对某个数据库详细讲
  • ✅ 帮你把 游标改成无游标 SQL
  • ✅ 给你一个 真实业务场景示例

你用的是 MySQL / Oracle / SQL Server / PostgreSQL 哪一种?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI