发布时间:2026-04-29 17: 09: 00
很多人一提到PL/SQL游标,第一反应就是“查出来的数据一行一行取”。这当然没错,但如果只停在这个层面,后面一写就容易把隐式游标、显式游标、`SELECT INTO`、`OPEN FETCH CLOSE`和`FOR LOOP`搅在一起。Oracle官方文档把这件事分得很清楚,PL/SQL里既有系统自动管理的隐式游标,也有需要自己声明和管理的显式游标;显式游标更灵活,特别适合处理多行结果集和带参数查询。
一、PL/SQL游标怎么定义
定义游标时,先不要急着写循环。更稳的做法是先分清你到底要不要“自己管理结果集”。如果只是查一行,很多时候`SELECT INTO`就够了;如果查询会返回多行,或者同一条查询要反复使用,显式游标更合适。Oracle官方说明里也明确提到,显式游标需要先声明并定义,再通过两种方式处理结果集,一种是`OPEN`、`FETCH`、`CLOSE`,另一种是放进cursor`FOR``LOOP`。
1、最常见的是“声明并定义”写在一起
显式游标最常用的写法,就是直接把游标名和查询放在一起定义。官方给出的标准语法是`CURSOR cursor_name IS select_statement;`,如果需要,也可以带参数或`RETURN`类型。平时做多行查询时,这种写法最直观,也最容易维护。
2、需要时也可以“先声明,后定义”
Oracle官方说明里提到,显式游标既可以先声明后定义,也可以一步写完。前者更适合块体稍大、你想先把结构列出来,或者需要显式写出`RETURN`类型的场景。这个写法在包或较长匿名块里会更清楚。
3、查询条件要变时,用带参数游标
如果同一条查询要按不同条件重复执行,就不要每次写死条件。Oracle官方明确提到,显式游标可以接受参数,这也是它比隐式游标更灵活的地方。带参数游标特别适合“按部门查员工”“按工资线查记录”这类场景。
4、接收整行数据时,优先考虑记录变量
Oracle官方在`FETCH`说明里写得很清楚,`INTO`后面既可以接多个变量,也可以接一个记录变量;而`%TYPE`和`%ROWTYPE`很适合为`FETCH`准备类型匹配的变量。平时如果字段多、查询列变化可能较大,用记录变量通常比一个个标量变量更省事。
二、PL/SQL怎么遍历游标结果集
遍历结果集时,最常见的其实就两条路。一条是自己手工控制游标生命周期,也就是`OPEN`、`FETCH`、`CLOSE`;另一条是直接用cursor`FOR``LOOP`,让PL/SQL帮你完成打开、取数和关闭。Oracle官方文档对这两种方式的边界讲得很明确,前者更灵活,后者代码更短。
1、手工遍历要按固定顺序来
如果你想自己控制游标,那标准顺序就是先`OPEN`,再循环里`FETCH`,最后`CLOSE`。官方说明里写到,`OPEN`会识别结果集并把游标放到第一行之前;`FETCH`会取当前行并把游标推进到下一行;`CLOSE`会释放资源。顺序一旦乱了,就很容易报`INVALID_CURSOR`或`CURSOR_ALREADY_OPEN`。
2、循环退出通常看`%NOTFOUND`
很多人第一次写手工遍历时,最容易漏掉退出条件。Oracle官方明确说明,`FETCH`在取不到更多行时不会自动抛异常,因此通常要在循环里用`%NOTFOUND`判断是否退出。常见写法就是`FETCH`之后立刻`EXIT WHEN cursor_name%NOTFOUND;`。
3、想写得更短,就用cursor`FOR``LOOP`
如果你不需要精细控制游标打开和关闭,cursor`FOR``LOOP`会更省事。Oracle官方文档说明,这种写法会隐式声明一个`%ROWTYPE`记录变量,并自动完成打开游标、逐行抓取和关闭游标的动作。对大多数普通遍历场景来说,这种写法更干净。
4、只在一处使用查询时,也可以直接把查询写进循环
Oracle官方还给了一种更短的形式,就是把`SELECT`直接写进cursor`FOR``LOOP`。这种写法实际上走的是隐式游标逻辑,适合“一次性查、一遍性用”的场景。要是这条查询不会复用,这种写法通常比单独定义显式游标还简洁。
三、PL/SQL写游标时先看哪几项
很多人觉得游标难,其实难点往往不在语法,而在场景没分清。更稳的做法通常是先判断结果集是一行还是多行,再决定要不要显式游标;然后再判断是要手工控制,还是只想快速遍历。Oracle官方文档的结构本身也是按这个顺序展开的,先讲隐式和显式,再讲`SELECT INTO`、`FOR LOOP`、`OPEN FETCH CLOSE`。
1、只取一行时,不必先上显式游标
如果查询本来就只该返回一行,优先考虑`SELECT INTO`。Oracle官方说明里,`SELECT INTO`就是处理单行结果集的常见方式。游标更适合多行场景,而不是所有查询都先写一层游标。
2、多行结果集时,再选显式游标
一旦结果会返回多行,显式游标就更合适。官方定义里也明确提到,显式游标通常关联的是会返回多行的查询。这个时候再决定是用手工`OPEN FETCH CLOSE`,还是用`FOR LOOP`。
3、要灵活控制时用手工遍历
如果你要在取数过程中插入更多控制逻辑,例如分段处理、部分提取、复杂退出条件,手工`OPEN FETCH CLOSE`更灵活。因为这一套流程由你自己管理,控制粒度更细。
4、只求简洁稳定时用`FOR LOOP`
如果你的目标只是把结果集顺着读完,cursor`FOR``LOOP`通常是最省事的写法。Oracle官方已经明确说明,它会自动声明记录、自动打开、自动抓取、自动关闭,所以代码量更小,也更不容易漏掉关闭游标。
总结
PL/SQL游标怎么定义,关键不是先背语法,而是先分清你要不要自己管理结果集。多行查询更适合显式游标,写法上既可以声明和定义放一起,也可以先声明后定义,还可以带参数。PL/SQL怎么遍历游标结果集,最常用的两条路则是手工`OPEN FETCH CLOSE`和cursor`FOR``LOOP`。前者更灵活,后者更省代码。把“定义方式”和“遍历方式”这两层分开之后,PL/SQL游标通常会比刚开始想象的简单很多。
展开阅读全文
︾