游标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;

 

   

posted @ 2018-03-13 14:57  C+++++++wyl  阅读(1237)  评论(0编辑  收藏  举报