zoukankan      html  css  js  c++  java
  • 游标Cursor

    游标:只是一个指向查询语句返回的结果的指针,因此定义游标时,将包含一个查询定义。

        当游标打开后,数据被接收到一块内存区域存储,直到游标关闭。

        游标定义时并不会获取游标数据,只有在游标被打开后,游标相关的查询语句被执行,然后将检索到的结果保存到内存中。

        游标实际上指向的是一块内存区域,改区域位于进程全局区(PGA,Program Global Area)内部,称为上下文区域(Context Area)。

        在该区域中保存了以下三类信息:

          (1)查询返回的数据行

          (2)查询所处理的数据的行号

          (3)指向共享池中已分析的SQL语句。

    eg: 

    -- Created on 3/13/2018 by HP 
    declare
      -- Local variables here
      emprow emp%ROWTYPE;               --定义保存游标检索结果行的记录变量
      CURSOR emp_cur IS                 --定义游标
        select * from emp where deptno is not null;
    begin
      -- Test statements here
      open emp_cur;                     --打开游标
      LOOP                              --循环检索游标
        FETCH emp_cur                   --提取游标
          into emprow;
        DBMS_OUTPUT.put_line(emprow.empno);
        EXIT WHEN emp_cur%NOTFOUND;     --当游标检索完成后退出循环
      END LOOP;
      CLOSE emp_cur;                    --关闭游标
    end;

    在Oracle中, insert、Update、delete和select into 语句被执行时,都会隐含的创建游标,通过访问游标的四大属性 %FOUND、%ISOPEN、%NOTFOUND、%ROWCOUNT来访问游标的相关属性。

    游标属性用于返回游标的执行信息,不论是显式游标,还是隐式游标,都包含四大属性 %FOUND、%ISOPEN、%NOTFOUND、%ROWCOUNT。

    在使用显式游标属性时,必须带有游标名作为前缀,而使用隐式游标时,使用SQL作为前缀。

    (1)%ISOPEN属性:判断对应的游标变量是否打开,如果打开,则返回true;否则返回false

    (2)%FOUND属性:当游标被打开后,在调用fetch语句获取数据之前,%FOUND会产生NULL值,而此后每取得一行数据,其值为true,如果最后一次取得数据失败,其值会变为false。

    (3)%NOTFOUND属性:与%FOUND属性相反。

    (4)%ROWCOUNT属性:返回 到目前为止已经从游标中提取出的记录行数,当游标被打开时,%ROWCOUNT值为0,此后每提取一行数据,%ROWCOUNT的值就加1.

    (一)批量提取游标数据: 使用 BULK COLLECT 批处理子句可以一次性将游标中的结果集保存到集合中。

    eg:  FETCH   cursor_name BULK COLLECT  INTO collection_table_name;

    (二)游标 FOR循环

    -- Created on 3/13/2018 by HP 
    declare
      -- Local variables here
      CURSOR dept_cursor IS
        SELECT * FROM dept; --定义游标类型
    begin
      -- Test statements here
      for dept_row in dept_cursor LOOP
        DBMS_OUTPUT.put_line(dept_row.dname);
      END LOOP;
    end;

    还可以在FOR语句的IN子句中使用子查询,而不用显示定义一个游标

    -- Created on 3/13/2018 by HP 
    declare
    begin
      -- Test statements here
      for dept_row in (select * from dept) LOOP
        DBMS_OUTPUT.put_line(dept_row.dname);
      END LOOP;
    end;

       

  • 相关阅读:
    ajax 发送 json 数组
    h5拖动总结
    TypeScript 学习
    java程序员面试经历(不忘初心,永不放弃,方得始终)。
    mysql统计天、周、月、季度、半年、年
    C++错误unresolved external symbol _WinMain@16
    记mysql条件分支语句CASE WHEN THEN ELSE END的使用
    freemarker数据格式化问题(即数值超过三位后自动添加逗号问题)
    tomcat启动内存溢出三种解决方案:java.lang.OutOfMemoryError:PermGen space解决办法
    Spring事务异常回滚,捕获异常不抛出就不会回滚
  • 原文地址:https://www.cnblogs.com/ly01/p/8556885.html
Copyright © 2011-2022 走看看