游标是指向查询结果集的一个指针,通过游标可以将查询结果集中的记录逐一取出,并在PL/SQL程序块中进行处理。
游标的类型有两种:隐式游标和显示游标。隐式游标是由系统自动创建并管理的游标。PL/SQL会为所有的SQL数据操作声明一个隐式的游标,包括只返回一条记录的查询操作。对于返回多条记录的查询,必须自己创建显示游标。
具体采用OPEN、FETCH和CLOSE语句来控制游标。OPEN用于打开游标并使游标指向结果集的第一行,FETCH会检索当前行的信息并把游标指向下一行,当最后一行被处理完后,CLOSE就会关闭游标。
语法结构:声明游标
| CURSOR 游标名[(参数1 数据类型[,参数2 数据类型…])] IS SELECT语句; —游标的声明 |
|---|
游标命名规范: C_游标名
语法结构:执行游标
| OPEN 游标名[(实际参数1[,实际参数2…])]; —打开游标 FETCH 游标名 INTO 变量名1[,变量名2…]; 或 FETCH 游标名 INTO 记录变量; —提取数据 CLOSE 游标名; —关闭游标(千万别忘了!) |
|---|
游标属性:%FOUND和%NOTFOUND
%FOUND:
用于判断游标是否从结果集中提取数据。如果提取到数据,则返回值为TRUE,否则返回值为FALSE。
%NOTFOUND:
该属性与%FOUND相反,如果提取到数据则返回值为FALSE;如果没有,则返回值为TRUN。
【例】查询EMP表中经理的员工编号、姓名、工作和工资
语法结构:方法1
DECLARECURSOR C_JOB IS -- 类型定义SELECT EMPNO, ENAME, JOB, SALFROM EMPWHERE JOB ='MANAGER';C_ROW C_JOB%ROWTYPE; -- 定义一个游标变量BEGINOPEN C_JOB;LOOPFETCH C_JOB -- 提取一行数据到C_ROWINTO C_ROW;-- 判读是否提取到值,没取到值就退出-- 取到值C_JOB%NOTFOUND 是FALSE-- 取不到值C_JOB%NOTFOUND 是TRUEEXIT WHEN C_JOB%NOTFOUND;DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO ||'-'|| C_ROW.ENAME ||'-'||C_ROW.JOB ||'-'|| C_ROW.SAL);END LOOP;CLOSE C_JOB; -- 关闭游标END;
语法结构:方法2 FOR循环
DECLARE--定义一个游标变量CURSOR C_JOB ISSELECT EMPNO, ENAME, JOB, SALFROM EMPWHERE JOB ='MANAGER';BEGINFOR X IN C_JOBLOOPDBMS_OUTPUT.PUT_LINE( X.EMPNO ||'-'|| X.ENAME ||'-'|| X.JOB ||'-'|| X.SAL );END LOOP;END;
语法解析:
游标FOR循环不需要事先定义,它会隐式声明一个代表当前的循环索引变量。系统自动打开游标,当所有行都被处理后,就会自动关闭游标,不需要人为操作。
