热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

详解ORACLE中游标的生命周期

在网络或者书籍中,我们可以非常容易的了解到ORACLE中游标的生命周期包括如下部分:1,打开游标--opencursor,此步骤在UGA里申请一块内存给游标使用,这个时候游标还没有与sql语句关联。2,解析游标--sql与游标关联起来,解析sql的内容(包括执行计

在网络或者书籍中,我们可以非常容易的了解到ORACLE中游标的生命周期包括如下部分: 1,打开游标-- open cursor,此步骤在 UGA 里申请一块内存给游标使用,这个时候游标还没有与sql语句关联。 2,解析游标-- sql与游标关联起来,解析sql的内容(包括执行计

在网络或者书籍中,我们可以非常容易的了解到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性能诊断艺术》中的代码片段,我们来研究一下游标的生命周期;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

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跟踪各行代码的执行效率如下:

详解ORACLE中游标的生命周期   三联

可以看出,游标生命周期中的各个部分均会占有执行时间,因此,如果可以消除一些执行步骤显然会提高性能. 那些操作可以消除那?参加下图

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

-- -----------

-- | open_cursor |

-- -----------

-- |

-- |

-- v

-- -----

-- ------------>| parse |

-- | -----

-- | |

-- | |---------

推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 精选30本C# ASP.NET SQL中文PDF电子书合集
    欢迎订阅我们的技术博客,获取更多关于C#、ASP.NET和SQL的最新资讯和资源。 ... [详细]
author-avatar
Joanna阿咪个_995
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有