Oracle PL/SQL 程序设计读书笔记 - 第15章 数据提取
Oracle PL/SQL 程序设计读书笔记 - 第15章 数据提取
Oracle PL/SQL 程序设计读书笔记 - 第15章 数据提取
每当在PL/SQL中执行一个SQL语句时,Oracle数据库都会为这个语句分配一个私有工作区,并在系统全局区(SGA)中管理该SQL语句指定的数据。 PL/SQl提供几种不同的方法来命名这个私有工作区,以及操作其中的信息。包括:
- 隐式游标
- 显式游标
- 游标变量
- 游标表达式
- 动态SQL查询
15.1 游标基础
15.1.1 一些有关数据提取的术语
- 静态SQL:如果当一个SQL语句所在的代码块被编译时,这个SQL语句就已经是完全指定或者说是固定的,那么就说明这个SQL语句是静态SQL。
- 动态SQL:如果一个SQL语句直到运行时刻才被构造出来并执行,这个语句就说明动态SQL语句。
- 结果集:SQL语句所请求的行集的合。结果集会被缓存在SGA中以提升访问数据和修改数据的性能。
- 隐式游标:每次执行一个SQL DML语句或者SELECT INTO语句,后者直接把数据库中的一行返回到一个PL/SQL数据结构中,PL/SQL都会声明和使用一个隐式游标。
- 显示游标:这种游标是在应用程序中明确的把一个SELECT语句声明成一个游标。我们还要明确的执行各种游标操作。
- 游标变量:这是一个指向或者引用游标对象的变量。
- 游标属性:游标属性的样式是在游标的名字或者游标变量名字后面加上%attribute_name。
- 批量处理:oracle 8i数据库以后版本中,PL/SQL为查询语句提供了BULK COLLECT语法。
15.1.3 游标属性介绍
- %FOUND 如果成功取到记录就返回TRUE
- %NOTFOUND 如果没有成功取到记录就返回TRUE
- %ROWCOUNT 返回到目前为止,已经从游标中取出的记录数量
- %ISOPEN 如果游标是打开的,就返回TRUE
- %BULK_ROWCOUNT 返回FORALL语句修改的记录数量
-
%BUILK_EXCEPTIONS 返回FORALL语句修改记录出现的异常信息。
-
对于隐式游标,游标的名字固定就是SQL
15.1.5 在显式游标和隐式游标间做选择
在Oracle8数据库开始,作为一项非常特殊的优化结果,我们的隐式游标现在要比等价的显式游标运行得更有效,而不是低效。 但在之前因为隐式游标会遵守ISO标准总是执行两个fetch动作,从而要比显示式游标性能更差。
15.3 使用显式游标
15.3.1 声明显式游标
CURSOR cursor_name [([parameter [,parameter...]])]
[RETURN return_specification]
IS SELECT_statement
[FOR UPDATE [OF column_list]];
15.3.2 打开显式游标
OPEN cursor_name [(argument [,argument...])];
无论我们什么时候开始第一次取数操作,Oracle数据库的读一执行性模型都会保证所有的取数操作反映的都是游标打开那一的数据状态。如果SELECT语句还使用了FOR UPDATE子句,这个查询所标识的所有记录在游标打开时刻都会被锁定。
15.3.3 从显式游标中提取数据
FETCH cursor_name INTO record_or_variable_list;
15.4 SELECT...FOR UPDATE
如果是远程的对象,可以用数据库的初始化参数DISTRIBUTEDLOCKTIMEOUT设定这个限制值。
15.4.1 用COMMIT释放锁资源
一旦带有FOR UPDATE语句的游标被打开,这个游标所识辊出的结果集的所有行就都会被锁定,并且要一直等到代码中显式地发出一个COMMIT或者ROLLBACK语句才会释放。
如果我们从SELECT FOR UPDATE游标中用FETCH提取数据后需要执行COMMIT或者ROLLBACK操作,我们应该用代码阻止从该游标中继续提取数据。
15.4.2 WHERE CURRENT OF 语句
PL/SQL为游标的UPDATE和DELETE语句提供了WHERE CURRENT OF语句。这个语句可以让我们很容易地修改最后取出来的数据行。
15.5 游标变量和REF CURSOR
游标变量和显式变量不一样,后者已经为结果集的PL/SQL工作区指定了名字,而游标变量只是指向这个工作区的引用。
15.5.3 声明REF CURSOR类型
- 创建下个引用游标类型
-
基于上面这个类型声明真正的游标变量
TYPE cursortypename IS REF CURSOR [RETURN return_type];
-
指定了RETURN的REF CURSOR语句也被叫做强类型。相反的叫做弱类型。
- 从Oracle 9i开始,提供了一个预宇瞻的弱类型的REF CURSOR叫做SYS_CURSOR
15.5.4 声明游标变量
声明一个游标变量和创建一个真正的游标对象,二者之间的区别在于,后者是通过游标的SQL语句查询出的结果集。而游标变量引用或者指向一个游标对象。声明一个游标变量并不会创建一个游标对象。只有在OPEN FOR语法创建一个新的游标对象然后再把它赋值给游标变量才行。
15.5.5 打开游标变量
OPEN cursor_name FOR select_statement;
15.5.6 从一个游标变量获取数据
处理ROWTYPE_MISMATCH异常:
我们可以捕获这个异常,然后尝试用不同的INTO子句从游标变量中提取数据。不过即使我们是在程序中第二次执行FETCH语句,我们得到的仍然是游标对象查询的结果集的第一行。对于弱类型的REF CURSOR来说,这个功能非常有用。
通过把一个游标变量赋值给另外一个有着不同作用范围的游标变量,即便超出了第一个游标变量的作用范围,这个游标对象仍然是可以访问的。
15.6 游标表达式(略,这个有点复杂)
CURSOR(subquery)
15.6.2 游标表达式的约束限制
- 我们不能把游标表达式用于隐式游标,因为没有机制支持把嵌套游标的数据取到PL/SQL数据结构中。
- 游标表达式只能出现在最外层的SELECT列表中。
- 我们只能在没有嵌套到任何其他的查询表达式中的SELECT语句中使用游标表达式,除非查询表达式被定义成游标表达式本身的子查询。
- 声明视图时不能使用游标表达式。
- 如果在动态SQL中使用游标表达式,我们不能对游标表达式执行BIND和EXECUTE操作。