对于session cursor而言,可以将游标理解为任意的DML,DQL语句(个人理解,有待核实)。即一条SQL语句实际上就是一个游标,只不过session cursor分为显示游标和隐式游标,以及游标指针。由上面游标的生命周期可知,任何的游标(SQL语句)都必须经历内存分配,解析,执行与关闭的过程。故对隐式游标而言,生命周期的所有过程由系统来自动完成。对所有的DML和单行查询(select ... into ...)而言,系统自动使用隐式游标。多行结果集的DQL则通常使用显示游标。
一个session cursor只能对应一个shared cursor,而一个shared cursor却可能同时对应多个session cursor。
共享游标举例 假设有用户SCOTT和KING,两者均有表EMP。先以SCOTT为例,执行如下语句: select * from emp where empno = 7788; SELECT * from emp where empno = 7788; SELECT * FROM emp WHERE empno = 7788; select * from emp where empno = 7788;
以上4条语句,第1条和第4条完全相同,第1条、第2条、第3条在大小写上有不同,查询v$sqlarea: select sql_id, sql_text, executions from v$sqlarea where sql_text like '%empno = 7788%' and sql_text not like '%from v$sqlarea%'; 执行结果见下图,有3条记录,说明产生了3个父游标,其中一个父游标执行了2次。这说明,SQL语句必须完全一致(大小写、空格回车等)才能共享,进而避免硬解析。
这3个父游标对应的子游标可以在v$sql中获得:
select sql_id, hash_value, child_number, plan_hash_value, sql_text, executions from v$sql where sql_text like '%empno = 7788%' and sql_text not like '%from v$sql%';