关于sql cursor的一点小解释

我们这里面讲的游标,说的是select、update、delete、insert语句。当一个sql语句执行的时候,会在会话的PGA的UGA里面(共享模式下面,UGA会放在SGA中),生成一个cursor,这个cursor是一个handle(一个存有地址的内存结构),具体的这个sql语句的执行计划存在shared pool中。
ORA10GR2> declare
  2          c sys_refcursor;
  3          l_string varchar2(30);
  4  begin
  5          open c for select dummy from dual;
  6          loop
  7                  fetch c into l_string;
  8                  exit when c%notfound;
  9                  dbms_output.put_line( c%rowcount || ' ' || l_string );
10          end loop;
11          close c;
12          dbms_output.put_line( '--------------' );
13          open c for select ename from scott.emp where ename like 'S%';
14          loop
15                  fetch c into l_string;
16                  exit when c%notfound;
17                  dbms_output.put_line( c%rowcount || ' ' || l_string );
18          end loop;
19          close c;
20  end;
21  /
1 X
--------------
1 SCOTT
2 SMITH

PL/SQL procedure successfully completed.


"one" cursor - "two" statements - one after the other. (一个游标,两条语句)。

查询数据字典v$open_cursor
This view lists cursors that each user session currently has opened and parsed.

那么我们讨论一下,游标在执行的时候到底是否存储数据呢?
1、不存储数据
    1、例如,直接执行这条语句:select * from ten_million_billion_row_table;,马上执行,马上获取数据。
    2、使用fetch,随着我们的访问,oracle读取数据
2、存储数据(或者部分数据)
select id, count(*) from ten_million_billion_row_table group by id;
数据存储在workarea,工作区也是存储在UGA中。



标签: 暂无标签
oraunix

写了 199 篇文章,拥有财富 1026,被 339 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

成为第一个吐槽的人

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈