在网络或者书籍中,我们可以非常容易的了解到Oracle中游标的生命周期包括如下部分:1,打开游标-- open cursor,此步骤在 UGA 里申请一块内存给游标使用,这个时候游标还没有与sql语句关联。2,解析游标-- sql与游标关联起来,解析sql的内容(包括执行计划),解析后的内容会被加载到共享池中(share pool-- library cache)。在UGA申请的内存用来保存指向这个共享游标(share cursor)在library cache中的位置。3,定义输出变量-- 如果sql语句返回数据,必须先定义接收数据的变量。这一点不仅对查询语句很重要,对于使用returning 自居的delete、insert和update 语句也很重要。4,绑定输入变量-- 如果sql语句使用了绑定变量,必须提供他们的值。绑定的过程是不做什么检查。如果指定了无效的数据,执行的过程中会爆出一个运行时错误。5,执行游标-- 执行跟游标关联的sql。注意 数据库并非总是在这一步做重要的事情。事实上,对于很多类型的查询语句来说,真正的处理过程通常会被推迟到fetch数据阶段。6,获取游标-- 如果sql语句返回数据,这一步会接受这些数据。特别是在查询语句中,大部分的处理工作都是在这一步进行的。在查询语句中,可能只会读取部分记录,换句话讲,游标有可能在取到所有记录前被关闭。7,关闭游标-- 释放UGA中与这个游标有关的资源,从而这些资源可供其他的游标使用。在library cache中的share cursor不会被清除,它会继续保留在library cache 中,等待被重用(软解析重用)。重复的内容,我们不做过多介绍,今天我们来看一下游标生命周期中各个部分所扮演的角色,以及如何利用它们来优化我们的程序。--------------------------------------------------------------------------------Oracle 函数中游标及递归的应用 http://www.linuxidc.com/Linux/2014-06/103553.htm诊断Oracle high version count(高版本游标)问题 http://www.linuxidc.com/Linux/2014-06/103151.htmOracle数据库中游标的使用 http://www.linuxidc.com/Linux/2013-10/90877.htmLinux-6-64下安装Oracle 12C笔记 http://www.linuxidc.com/Linux/2013-07/86805.htm在CentOS 6.4下安装Oracle 11gR2(x64) http://www.linuxidc.com/Linux/2014-02/97374.htmOracle 11gR2 在VMWare虚拟机中安装步骤 http://www.linuxidc.com/Linux/2013-09/89579p2.htmDebian 下 安装 Oracle 11g XE R2 http://www.linuxidc.com/Linux/2014-03/98881.htm
Oracle性能诊断艺术 中文清晰PDF http://www.linuxidc.com/Linux/2014-06/103723.htm--------------------------------------------------------------------------------借鉴《Oracle性能诊断艺术》中的代码片段,我们来研究一下游标的生命周期;create or replace procedure cursor_test as
l_ename emp.ename%TYPE := "SCOTT";
l_empno dbms_sql.Number_Table;
l_cursor INTEGER;
l_retval INTEGER;
cnt integer := 1;
indx integer := 1;
res varchar2(4000);
BEGIN
for i in 1 .. 1000 loop
l_cursor := DBMS_SQL.open_cursor;
DBMS_SQL.parse(l_cursor,
"select empno from emp where ename <> :ename and 0 <> "||i , DBMS_SQL.native);
l_empno.delete();
DBMS_SQL.define_array(l_cursor, 1, l_empno,cnt,indx);
DBMS_SQL.bind_variable(l_cursor, ":ename", to_char(i));
l_retval := DBMS_SQL.execute(l_cursor); while DBMS_SQL.fetch_rows(l_cursor) > 0 loop
dbms_sql.column_value(l_cursor, 1, l_empno);
end loop;
res :="";
for j in 1 .. l_empno.count() loop
res := res || L_EMPNO(j);
end loop;
DBMS_OUTPUT.PUT_LINE(res);
dbms_sql.close_cursor(l_cursor);
end loop;
end;通过plsql profiler跟踪各行代码的执行效率如下:可以看出游标生命周期中的各个部分均会占有执行时间,因此,如果可以消除一些执行步骤显然会提高性能。那些操作可以消除那?参考下图-- -----------
-- | open_cursor |
-- -----------
-- |
-- |
-- v
-- -----
-- ------------>| parse |
-- | -----
-- | |
-- | |---------
-- | v |
-- | -------------- |
-- |-------->| bind_variable | |
-- | ^ ------------- |
-- | | | |
-- | -----------| |
-- | |<--------
-- | v
-- | query?---------- yes ---------
-- | | |
-- | no |
-- | | |
-- | v v
-- | ------- -------------
-- |----------->| execute | ->| define_column |
-- | ------- | -------------
-- | |------------ | |
-- | | | ----------|
-- | v | v
-- | -------------- | -------
-- | ->| variable_value | | ------>| execute |
-- | | -------------- | | -------
-- | | | | | |
-- | ----------| | | |
-- | | | | v
-- | | | | ----------
-- | |<----------- |----->| fetch_rows |
-- | | | ----------
-- | | | |
-- | | | v
-- | | | --------------------
-- | | | | column_value |
-- | | | | variable_value |
-- | | | ---------------------
-- | | | |
-- | |<--------------------------
-- | |
-- -----------------|
-- |
-- v
-- ------------
-- | close_cursor |
-- ------------
--
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-06/103724p2.htm
ORA-27054错误解决两例CentOS下安装MySQL及Windows下使用Navicat for MySQL连接相关资讯 Oracle游标
- Oracle游标的使用方法 (今 13:57)
- Oracle 游标使用全解 (05/01/2015 17:35:19)
- Oracle使用游标为所有用户表创建主 (02/08/2015 11:22:49)
| - Oracle游标—for、loop、if结合应 (05/01/2015 17:43:10)
- Oracle游标介绍 (02/09/2015 10:32:04)
- Oracle使用游标删除所有用户数据表 (01/23/2015 17:25:09)
|
本文评论 查看全部评论 (0)