导读:本期聚焦于小伙伴创作的《Oracle Cursor是什么?如何正确使用并理解其工作原理与应用场景》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Oracle Cursor是什么?如何正确使用并理解其工作原理与应用场景》有用,将其分享出去将是对创作者最好的鼓励。

Oracle Cursor是Oracle数据库为SQL语句分配的一块私有内存区域,主要用于存储查询返回的结果集,同时保存游标的当前状态信息,是PL/SQL程序处理多行查询结果的核心工具。

Oracle Cursor是什么?如何正确使用并理解其工作原理与应用场景

Oracle Cursor的基本分类

Oracle中的游标主要分为两类,分别是隐式游标和显式游标,二者的使用方式和管理逻辑有明显区别。

隐式游标

隐式游标是Oracle自动为所有DML语句(INSERT、UPDATE、DELETE)以及返回单行结果的查询语句创建的游标,用户不需要手动声明和管理,Oracle会自动完成打开、关闭等操作。隐式游标有一个固定的名称SQL,开发者可以通过这个名称访问隐式游标的属性。

显式游标

显式游标需要用户手动进行声明、打开、提取数据、关闭等一系列操作,主要用于处理返回多行数据的查询场景,能够让开发者对结果集的处理过程进行更精细的控制。

游标的常用属性

无论是隐式游标还是显式游标,都有几个常用的属性,通过这些属性可以判断游标的操作状态以及获取相关数据:

  • %FOUND:如果最近一次从游标中获取数据成功,返回TRUE,否则返回FALSE。
  • %NOTFOUND:与%FOUND相反,如果最近一次获取数据失败,返回TRUE,否则返回FALSE。
  • %ROWCOUNT:返回到目前为止从游标中获取的行数,或者DML操作影响的行数。
  • %ISOPEN:判断游标是否已经打开,显式游标常用这个属性,隐式游标始终返回FALSE。

隐式游标使用示例

隐式游标不需要手动声明,下面通过一个更新员工薪资的示例来展示隐式游标的使用:

DECLARE
  v_emp_id NUMBER := 1001; -- 员工ID
  v_salary NUMBER; -- 员工薪资
BEGIN
  -- 更新员工薪资,这里会触发隐式游标
  UPDATE emp SET salary = salary * 1.1 WHERE emp_id = v_emp_id;
  
  -- 通过隐式游标SQL的属性判断操作结果
  IF SQL%FOUND THEN
    DBMS_OUTPUT.PUT_LINE('更新成功,共影响' || SQL%ROWCOUNT || '行数据');
  ELSE
    DBMS_OUTPUT.PUT_LINE('未找到对应员工,更新失败');
  END IF;
  
  -- 查询单个员工薪资,也是隐式游标场景
  BEGIN
    SELECT salary INTO v_salary FROM emp WHERE emp_id = v_emp_id;
    DBMS_OUTPUT.PUT_LINE('员工薪资为:' || v_salary);
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('未查询到该员工的薪资信息');
  END;
  
  COMMIT;
END;
/

显式游标使用示例

显式游标需要手动完成完整的生命周期管理,下面通过一个查询所有员工信息的示例来展示显式游标的使用流程:

DECLARE
  -- 声明显式游标,查询所有员工ID和姓名
  CURSOR emp_cur IS
    SELECT emp_id, emp_name FROM emp WHERE dept_id = 10;
  
  v_emp_id NUMBER; -- 存储员工ID
  v_emp_name VARCHAR2(50); -- 存储员工姓名
BEGIN
  -- 打开游标
  OPEN emp_cur;
  
  -- 循环提取游标中的数据
  LOOP
    -- 提取一行数据到变量中
    FETCH emp_cur INTO v_emp_id, v_emp_name;
    
    -- 当没有更多数据时退出循环
    EXIT WHEN emp_cur%NOTFOUND;
    
    -- 输出获取到的员工信息
    DBMS_OUTPUT.PUT_LINE('员工ID:' || v_emp_id || ',员工姓名:' || v_emp_name);
  END LOOP;
  
  -- 输出总共获取的行数
  DBMS_OUTPUT.PUT_LINE('总共获取' || emp_cur%ROWCOUNT || '条员工信息');
  
  -- 关闭游标
  CLOSE emp_cur;
END;
/

显式游标的简化用法:游标FOR循环

为了简化显式游标的使用,Oracle提供了游标FOR循环,不需要手动打开、提取、关闭游标,语法更加简洁:

DECLARE
  -- 声明显式游标
  CURSOR emp_cur IS
    SELECT emp_id, emp_name, salary FROM emp WHERE salary > 5000;
BEGIN
  -- 游标FOR循环,自动完成打开、提取、关闭操作
  FOR emp_rec IN emp_cur LOOP
    DBMS_OUTPUT.PUT_LINE('员工ID:' || emp_rec.emp_id || 
                         ',姓名:' || emp_rec.emp_name || 
                         ',薪资:' || emp_rec.salary);
  END LOOP;
END;
/

使用游标的注意事项

  • 显式游标使用完成后一定要及时关闭,释放对应的内存资源,避免资源泄漏。
  • 在使用FETCH提取数据前,要确保游标已经打开,否则会抛出错误。
  • 如果查询结果可能返回多行,不要使用SELECT INTO语句,否则会抛出TOO_MANY_ROWS异常,这种情况应该使用显式游标处理。
  • 隐式游标的%ROWCOUNT属性在DML操作后立即可以获取,但是对于查询语句,只有使用SELECT INTO且查询到数据时才会有值。

Oracle_CursorPL/SQL游标属性显式游标隐式游标修改时间:2026-06-06 23:08:40

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。