Oracle数据库中的cursor分为2中类型:shared cursor,session cursor
Shared cursor:库缓存,sga中一块内存区域
会缓存存储目标sql的sql文本、解析树、该sql所涉及的对象定义、该sql所使用的绑定变量类型和长度,以及改sql的执行计划等信息。
Shared cursor又分为:parent cursor,child cursor
分别在V$SQLAREA,V$SQL,V$SQLAREA用于查看parent cursor,V$SQL用于查看child cursor。
在Oracle数据库里,任意一个目标sql一定会同时对应两个shared cursor。Parent cursor会存储该sql的文本,sql真正的可以被重用的解析树和执行计划则存储在child cursor。
SQL> select empno,ename from emp;
SQL> select sql_text,sql_id,version_count from v$sqlarea where sql_text like'select empno,ename from emp%';
SQL> select plan_hash_value,child_number from v$sql where sql_id='78bd3uh4a08av';
PLAN_HASH_VALUE CHILD_NUMBER
--------------- ------------
3956160932 0
针对不同的sql,都有不同的parent,child cursor
Oracle里的session cursor
Session cursor:当前session解析和执行sql的载体,缓存在pga中
Session cursor与session是一一对应的,不同的session之间的session cursor无法共享
Session cursor是有生命周期,至少会经历一次open,parse,bind,execute,fetch和close
1 Oracle在解析和执行目标sql时,始终会先去当前session的pga中寻找是否有匹配的缓存session cursor
2 在当前session的pga中找不到匹配的缓存,Oracle就去缓存中寻找是否存在匹配的parent cursor,如果找不到,
Oracle就会生新生成一个session cursor和一对shared cursor。如果找到了匹配的parent cursor,Oracle会生成一个新的session cursor和child cursor(child cursor会被挂在之前找到的parent cursor上)。
3 如果session中没有找到匹配的session cursor,而找到了匹配的parent cursor和child cursor,Oracle会新生成一个session cursor,(软解析)
4 如果在session 中找到了匹配的session cursor,Oracle可以以重用找到匹配的session cursor,通过此可以直接访问到该sql的parent cursor(软软解析)
Session cursor的相关参数:
Open_cursors:用于设定单个session中同时能够以open状态并存的session cursor的个数
SQL> show parameter open_cursors;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
open_cursors integer 300
SQL> select sid from v$mystat where rownum<2;
SID
----------
88
SQL> select count(*) from v$open_cursor where sid=88;
COUNT(*)
----------
3
SQL> select name,value from v$sysstat where;
NAME VALUE
opened cursors current 47
session_cached_cursor:用于设定单个session中能够以soft closed状态并存的session cursors的总数
SQL> show parameter session_cached_cursors;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
session_cached_cursors integer 20
在Oracle 11gr2中,对应的sql解析和执行的次数要超过3次 session cursor才能够被缓存在pga中
Session cursor的种类和用法
1 隐式游标
SQL%NOTFOUND,SQL%FOUND,SQL%ISOPEN,SQL%ROWCOUNT
SQL%FOUND:每一条dml执行前,值为null,改变一条以上的记录,其值为true,否则为false
SQL%NOTFOUND:每一条sql语句被执行成功后受其影响而改变的记录数是否为0,执行前为null,没有返回或没有改变任何记录,其值为TRUE,否则为FALSE
SQL%ISOPEN:表示隐式游标是否处于open状态,对于隐式游标,其值永远是FALSE
SQL%ROWCOUNT:表示一条sql语句成功执行后受其影响而改变的记录的数量,代表最近一次执行的sql的sql%rowcount,没有任何记录的值0
2 显式游标
在plsql中,显式的打开,关闭
Cursorname%found,cursorname%notfound,isopen,rowcount
当游标一次都还没有fetch,%found的值为null,没有数据是false,否则ture
当显式游标还没有打开,%found会报错invaild coursor