oraunix 发表于 2010-11-12 19:13:43

关于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);
4begin
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;
20end;
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中。



页: [1]
查看完整版本: 关于sql cursor的一点小解释