在 Oracle 数据库中,游标(Cursor)是一种用于处理 SQL 查询结果集的机制。通过游标,开发者可以在 PL/SQL 程序中逐行访问查询结果,实现对数据的灵活操作。游标不仅可以提高程序的可读性和灵活性,还能在复杂的业务逻辑中发挥重要作用。本文将详细介绍 Oracle 游标的定义、创建方法以及实际使用场景,帮助读者全面理解其工作原理与应用方式。
游标是 Oracle 中用于处理 SQL 查询结果的一种对象。它本质上是一个指向查询结果集的指针,允许程序逐行访问查询返回的数据。通过游标,开发者可以控制查询的执行过程,并对每一行数据进行处理。
在 PL/SQL 中,游标分为两种类型:显式游标(Explicit Cursor) 和 隐式游标(Implicit Cursor)。显式游标由用户手动声明和管理,而隐式游标则由 Oracle 自动处理,通常用于 DML(如 INSERT、UPDATE、DELETE)语句中。
游标的常见用途包括:
遍历查询结果中的每一行;
在循环中处理多行数据;
根据条件动态地操作数据。
显式游标需要用户手动声明、打开、提取和关闭,适用于复杂的数据查询和处理场景。
声明游标
声明游标时,需要定义一个 SELECT 查询语句。语法如下:
CURSOR cursor_name IS
SELECT column_list
FROM table_name
WHERE condition;例如,声明一个查询员工信息的游标:
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10;打开游标
在声明游标之后,需要使用 OPEN 语句来执行查询并准备提取数据:
OPEN emp_cursor;提取数据
使用 FETCH 语句从游标中逐行提取数据到变量中:
FETCH emp_cursor INTO v_emp_id, v_first_name, v_last_name;关闭游标
在完成数据提取后,应使用 CLOSE 语句关闭游标以释放资源:
CLOSE emp_cursor;完整示例
下面是一个完整的显式游标使用示例:
DECLARE
v_employee_id NUMBER;
v_first_name VARCHAR2(50);
v_last_name VARCHAR2(50);
CURSOR emp_cursor IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_employee_id, v_first_name, v_last_name;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('员工ID: ' || v_employee_id || ', 姓名: ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE emp_cursor;
END;在这个例子中,我们通过游标遍历了部门 ID 为 10 的所有员工,并输出他们的信息。
隐式游标由 Oracle 自动管理,主要用于 DML 操作(INSERT、UPDATE、DELETE),也可以用于单行查询。隐式游标的主要属性包括:
%ROWCOUNT:表示受影响的行数;
%FOUND:表示是否找到记录;
%NOTFOUND:表示是否未找到记录;
%ISOPEN:表示游标是否打开(仅在显式游标中有效)。
例如,在更新员工工资的操作中,可以使用隐式游标判断是否有符合条件的记录:
BEGIN
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 20;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('成功更新了 ' || SQL%ROWCOUNT || ' 条记录。');
ELSE
DBMS_OUTPUT.PUT_LINE('没有找到符合条件的记录。');
END IF;
END;带参数的游标
可以将参数传递给游标,使其更具灵活性。例如,根据不同的部门 ID 查询员工信息:
DECLARE
CURSOR emp_cursor (p_dept_id NUMBER) IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = p_dept_id;
v_dept_id NUMBER := 30;
v_employee_id NUMBER;
v_first_name VARCHAR2(50);
v_last_name VARCHAR2(50);
BEGIN
OPEN emp_cursor(v_dept_id);
LOOP
FETCH emp_cursor INTO v_employee_id, v_first_name, v_last_name;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('员工ID: ' || v_employee_id || ', 姓名: ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE emp_cursor;
END;游标变量(Ref Cursor)
Ref Cursor 是一种引用类型的游标,可以在存储过程中动态地传递和使用。例如:
DECLARE
TYPE emp_ref_cursor IS REF CURSOR RETURN employees%ROWTYPE;
emp_cursor emp_ref_cursor;
v_employee employees%ROWTYPE;
BEGIN
OPEN emp_cursor FOR SELECT * FROM employees WHERE department_id = 40;
LOOP
FETCH emp_cursor INTO v_employee;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('员工姓名: ' || v_employee.first_name || ' ' || v_employee.last_name);
END LOOP;
CLOSE emp_cursor;
END;避免不必要的游标使用
如果只需要获取单个值或少量数据,建议直接使用 SELECT INTO 语句,而不是使用游标。
合理管理游标生命周期
应确保在不再需要时及时关闭游标,以减少数据库资源占用。
使用游标优化性能
在处理大量数据时,游标可以帮助分批次处理数据,从而避免一次性加载过多数据导致内存溢出。
![]()
游标是 Oracle 中处理 SQL 查询结果的重要工具,尤其在 PL/SQL 编程中具有广泛的应用价值。无论是显式游标还是隐式游标,都能帮助开发者更高效地处理数据。掌握游标的定义、创建和使用方法,不仅有助于提升程序的灵活性和可维护性,还能在面对复杂业务逻辑时提供更强大的支持。因此,建议开发者在实际开发中合理运用游标,充分发挥其在数据处理中的优势。
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
根据查询的IPvb地址,查询该IPv6所属的区域,城市级查询。
2026美加墨世界杯小组赛、1/16决赛、1/8决赛、1/4决赛、半决赛、季军赛、决赛赛程及积分榜
提供多种拟人音色,支持多语言及方言,并可在同一音色下输出多语言内容。系统可自适应语气,流畅处理复杂文本。
Nano Banana(gemini-2.5-flash-image 和 gemini-3-pro-image-preview图像模型)是图像生成与编辑的最佳选择,可集成 Nano Banana API,实现高速预览。
支持通过自然语言文本智能生成高质量短视频。用户只需输入一段描述性文字,即可自动合成画面连贯、风格鲜明、配乐匹配的定制化视频内容。适用于短视频创作、广告预演、社交内容生成、游戏素材制作等场景,为开发者与创作者提供高效、灵活、富有想象力的视频生产新范式。