PL/SQL 游标

来源:互联网 发布:阿里云 吉峰农机 编辑:程序博客网 时间:2024/06/05 07:22

一、说明

游标字面理解就是游动的光标。
用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等等。

二、分类

  • 显式游标
    用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理。
  • 隐式游标
    是在执行插入(INSERT)、删除(DELETE)、修改(UPDATE)和返回单条记录的查询(SELECT)语句时有PL/SQL自动定义的。

三、属性

Oracle 游标有4个属性: %ISOPEN , %FOUND , %NOTFOUND, %ROWCOUNT
  • %ISOPEN 判断游标是否被打开,如果打开%ISOPEN 等于true,否则等于false
  • %FOUND %NOTFOUND 判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false
  • %ROWCOUNT 返回当前位置为止游标读取的记录行数。

四、使用

  • 声明游标
    CURSOR emp_info(vartype number) is select * from emp;
  • 打开游标
    open emp_info;
  • 读取游标
    fetch mycur into varno,varprice;
  • 关闭游标
    close emp_info;

五、显示游标遍历

  1. 方法一
    DECLARE  V_EMP_INFO EMP%ROWTYPE;  CURSOR EMP_INFO IS    SELECT * FROM EMP;   --1、声明游标BEGIN  OPEN EMP_INFO;         --2、打开游标,传递参数值    LOOP    FETCH EMP_INFO INTO V_EMP_INFO;   --3、提取游标fetch into      IF EMP_INFO%FOUND THEN      DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||                           V_EMP_INFO.HIREDATE);    ELSE      DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');      EXIT;    END IF;  END LOOP;  CLOSE EMP_INFO;       --4、关闭游标END;
  2. 方法二
    DECLARE  V_EMP_INFO EMP%ROWTYPE;  CURSOR EMP_INFO IS    SELECT * FROM EMP; --1、声明游标BEGIN  OPEN EMP_INFO; --2、打开游标,传递参数值    LOOP    FETCH EMP_INFO INTO V_EMP_INFO; --3、提取游标fetch into    EXIT WHEN EMP_INFO%NOTFOUND;    DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||                         V_EMP_INFO.HIREDATE);  END LOOP;  DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');  CLOSE EMP_INFO; --4、关闭游标END;
  3. 方法三
    DECLARE  V_EMP_INFO EMP%ROWTYPE;  CURSOR EMP_INFO IS    SELECT * FROM EMP; --1、声明游标BEGIN  FOR V_EMP_INFO IN EMP_INFO LOOP    DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||                         V_EMP_INFO.HIREDATE);  END LOOP;  DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');END;

六、隐式游标处理

DECLARE  V_EMP_INFO EMP%ROWTYPE;BEGIN  SELECT * INTO V_EMP_INFO FROM EMP WHERE ename='SMITH';  IF SQL%FOUND THEN    DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||                         V_EMP_INFO.HIREDATE);  END IF;  DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');END;

原创粉丝点击