Oracle里用游标抓数据那事儿,语法和用法简单聊聊
- 问答
- 2026-01-13 19:19:35
- 5
这事儿说白了,就像你在图书馆里找书,你不能一下子把整个书架的书都抱走,你得先知道有哪些书(声明游标),然后走过去,一本一本地拿下来看(打开游标并获取数据),看完了或者不想看了,就把书放回去,离开书架(关闭游标),游标就是帮你做这个“一本一本拿书”动作的工具。
根据 Oracle 官方文档(Oracle Database PL/SQL Language Reference 里关于 CURSOR 的部分),游标主要分两种:一种是隐式的,一种是显式的,隐式游标是 Oracle 数据库自己偷偷在背后用的,比如你执行一条 SELECT INTO 语句,或者执行一个 DML 操作(像 INSERT、UPDATE、DELETE),数据库会自动开一个游标来处理,弄完了又自己关掉,你基本上感觉不到它的存在,但这种方式有个限制,它一次只能处理一行数据,如果你的查询结果一下子出来好多行,那就得请出我们今天要重点聊的显式游标了。
显式游标就是你得自己亲手去定义、打开、抓取、关闭的游标,整个过程步骤清晰,让你能完全控制,下面我们就一步步看看怎么玩。

第一步,是声明游标,这就像是你去图书馆之前,先写个书单,告诉管理员你要找哪几类书,在 PL/SQL 代码里(通常是在 DECLARE 部分),你得用 CURSOR 关键字来定义这个游标,并且把你要执行的查询语句写清楚,你想从员工表里找出所有部门的员工,可以这么写:CURSOR cur_emp IS SELECT employee_id, last_name FROM employees WHERE department_id = 80; 这里,cur_emp 就是你给这个游标起的名字,后面跟着的就是具体的查询。
第二步,是打开游标,书单写好了,你现在要正式走进图书馆,找到对应的书架了,在 PL/SQL 的执行部分(BEGIN 后面),你用 OPEN 语句来打开之前声明的游标:OPEN cur_emp; 这条命令一执行,数据库就会真的去跑你定义的那个 SELECT 查询,把符合条件的数据都准备好,放在一个叫“活动集”的地方,这时候,游标的指针会指在结果集第一行数据的前面,等着你去拿。

第三步,也是最核心的一步,从游标里抓取数据,现在你开始从书架上拿书了,你用 FETCH 语句把游标当前指向的那一行数据拿出来,放进你事先准备好的变量里,FETCH cur_emp INTO v_emp_id, v_emp_name; 这里,v_emp_id 和 v_emp_name 就是你提前声明的变量,用来接住从游标里取出来的员工编号和姓名,每 FETCH 一次,游标的指针就会自动往下挪一行,你怎么知道什么时候书架上的书拿完了呢?这时候就需要一个判断条件。
第四步,判断是否还有数据,这就需要用到游标的一个属性:%NOTFOUND,当你 FETCH 之后,如果后面已经没有数据了,这个属性就会变成 TRUE,我们通常会把 FETCH 操作放在一个循环里(LOOP ... END LOOP),然后用 EXIT WHEN cur_emp%NOTFOUND; 这样的语句来判断,如果没数据了,就跳出循环。

最后一步,千万别忘了,关闭游标,书看完了,得把书架整理好,离开图书馆,你用 CLOSE 语句来关闭游标:CLOSE cur_emp; 关闭之后,这个游标占用的资源就释放了,你还可以用同样的游标名字再去打开一个新的查询。
把上面这些步骤串起来,一个完整的流程大概是这样的:
DECLARE
-- 1. 声明游标
CURSOR cur_emp IS
SELECT employee_id, last_name FROM employees WHERE department_id = 80;
-- 声明变量用来存数据
v_emp_id employees.employee_id%TYPE;
v_emp_name employees.last_name%TYPE;
BEGIN
-- 2. 打开游标
OPEN cur_emp;
LOOP
-- 3. 抓取数据
FETCH cur_emp INTO v_emp_id, v_emp_name;
-- 4. 判断是否还有数据,没有就退出循环
EXIT WHEN cur_emp%NOTFOUND;
-- 这里就可以对抓取到的 v_emp_id 和 v_emp_name 进行处理了
-- 比如打印出来,或者做一些计算
DBMS_OUTPUT.PUT_LINE('员工ID: ' || v_emp_id || ', 姓名: ' || v_emp_name);
END LOOP;
-- 5. 关闭游标
CLOSE cur_emp;
END;
/
除了这种最基础的 LOOP 循环,还有一种更简洁的写法,叫 FOR 循环游标,这种写法 Oracle 帮你把打开、抓取、判断、关闭这些琐事都包了,你只需要关心怎么处理每一行数据就行,上面的例子用 FOR 循环写会简单很多:
DECLARE
CURSOR cur_emp IS
SELECT employee_id, last_name FROM employees WHERE department_id = 80;
BEGIN
-- 注意这里,直接 FOR 记录变量 IN 游标名
FOR emp_rec IN cur_emp
LOOP
-- 直接通过记录变量 emp_rec 来访问列数据
DBMS_OUTPUT.PUT_LINE('员工ID: ' || emp_rec.employee_id || ', 姓名: ' || emp_rec.last_name);
END LOOP;
-- 不需要 OPEN, FETCH, CLOSE 了!
END;
/
这种写法特别省心,不容易出错,是大家平时更爱用的方式。
所以总结一下,在 Oracle 里用游标抓数据,本质上就是对一个结果集进行“逐行处理”的标准化流程,显式游标给了你精细控制的可能,而 FOR 循环游标则提供了便捷高效的选择,知道了这个“声明-打开-抓取-关闭”的基本套路,你就掌握了游标这件事的核心。
本文由盈壮于2026-01-13发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/80106.html
