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

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