Oracle PL/SQL 程序设计读书笔记 - 第15章 数据提取

news/2024/7/23 19:10:09

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操作。

转载于:https://www.cnblogs.com/tjpanda88/archive/2011/12/14/2288063.html


http://www.niftyadmin.cn/n/2679850.html

相关文章

如何在jsp页面中引入css样式表文件和javascript文件

一&#xff1a;如何在jsp页面中引入css样式表文件? 1&#xff0c; 首先把写好的css样式表内容存为*.css格式。如style.css 2&#xff0c; 在页面中引入这个css 样式文件。用如下的方式引入。 <link rel"stylesheet" href"./css/style.css" type&qu…

七夕节(打表水题)

七夕节 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5086 Accepted Submission(s): 1785 Problem Description七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们…

2018年10月24日提高组模拟赛Week 6总结

第一题数论基础&#xff0c;第二题打了暴力&#xff0c;第三题也暴力&#xff0c;于是水了Rank3Rank3Rank3&#xff0c;不得不膜拜ssl_wycssl\_wycssl_wyc巨老200 T1 码灵鼠 https://blog.csdn.net/xuxiayang/article/details/83419505 占比方法0~100各种蒙分100数论基础T2 S…

通过程序一句话备份恢复SqlServer数据库

通过程序一句话备份恢复SqlServer数据库 备份语句&#xff1a;BACKUP DATABASE[__DataBaseName__] TO DISK N//LocalCoputerNameOrIP/ShareDocument/FileName.bat WITH INIT, NOUNLOAD,NOSKIP,STATS10, NOFORMAT 恢复语句&#xff1a;Restore DataBase[__DataBaseName__] fro…

c语言求一元二次方程的根_C语言程序的测试

C语言程序的测试系统提供的图片程序调试的任务是排除程序中的错误&#xff0c;使程序能顺利地运行并得到预期的效果。程序的调试阶段不仅要发现和消除语法上的错误&#xff0c;还要发现和消除逻辑错误和运行错误。除了可以利用编译时提示的“出错信息”来发现和改正语法错误外&…

触发器执行顺序----From Me

创建新纪录&#xff1a; when-create-record when-new-block-instance when-new-record-instance转载于:https://www.cnblogs.com/CiWEi-/archive/2011/12/19/2293500.html

Linux shell命令 cp 加上-f还是提示是否覆盖

这是由于环境变量中有 allias cpcp -i 为了去掉这个系统自带的别名&#xff0c;能够使用grep -r --include"*" "alias cp" /查找设置这个环境变量的脚本文件&#xff1a; 我的ubuntu机器上是&#xff1a; ./.bash_aliases:alias cpcp -i 于是我将./.bash_…

idea debug调试_【分享吧】Java远程调试

前言在知道远程调试这个方法之前每次在服务器上测试代码都是在本地代码中打各种log&#xff0c;然后重新打包&#xff0c;上传&#xff0c;调试&#xff0c;这样比较费力费时&#xff0c;本文主要介绍java远程调试这个功能的入门版。本文以Intellij IDEA为例讲解怎么使用远程调…