游标是指向查询结果集的一个指针,通过游标可以将查询结果集中的记录逐一取出,并在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

    1. DECLARE
    2. CURSOR C_JOB IS -- 类型定义
    3. SELECT EMPNO, ENAME, JOB, SAL
    4. FROM EMP
    5. WHERE JOB ='MANAGER';
    6. C_ROW C_JOB%ROWTYPE; -- 定义一个游标变量
    7. BEGIN
    8. OPEN C_JOB;
    9. LOOP
    10. FETCH C_JOB -- 提取一行数据到C_ROW
    11. INTO C_ROW;
    12. -- 判读是否提取到值,没取到值就退出
    13. -- 取到值C_JOB%NOTFOUND FALSE
    14. -- 取不到值C_JOB%NOTFOUND TRUE
    15. EXIT WHEN C_JOB%NOTFOUND;
    16. DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO ||'-'|| C_ROW.ENAME ||'-'||
    17. C_ROW.JOB ||'-'|| C_ROW.SAL);
    18. END LOOP;
    19. CLOSE C_JOB; -- 关闭游标
    20. END;

    语法结构:方法2 FOR循环

    1. DECLARE
    2. --定义一个游标变量
    3. CURSOR C_JOB IS
    4. SELECT EMPNO, ENAME, JOB, SAL
    5. FROM EMP
    6. WHERE JOB ='MANAGER';
    7. BEGIN
    8. FOR X IN C_JOB
    9. LOOP
    10. DBMS_OUTPUT.PUT_LINE( X.EMPNO ||'-'|| X.ENAME ||'-'|| X.JOB ||'-'|| X.SAL );
    11. END LOOP;
    12. END;

    语法解析:
    游标FOR循环不需要事先定义,它会隐式声明一个代表当前的循环索引变量。系统自动打开游标,当所有行都被处理后,就会自动关闭游标,不需要人为操作。