我们这里面讲的游标,说的是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中。