欢迎光临
免费的PDF电子书下载网站

Oracle PL/SQL实例精解(原书第5版) PDF下载

编辑推荐

Oracle PL/SQL实例精解(原书第5版) PDF下载 ;

内容简介

本书通过实际的实验、示例和项目来讲解你所需的全部PL/SQL技能,它涵盖从基础语法、程序控制到*的优化和安全增强等方面的知识。读者循序渐进地学习每个关键任务,自己就能掌握当今最有价值的Oracle12c的PL/SQL编程技术。本书的方法完全反映了作者在哥伦比亚大学给专业人员讲授PL/SQL的广受好评的经验。数据库开发的新手和DBA可以通过学习本书快速获得成效。有经验的PL/SQL程序员会发现本书是很好的Oracle12c的解决方案参考。

作者简介

作 者 简 介?About the AuthorBenjamin Rosenzweig是Misys财务软件公司的高级项目经理,他自2002年以来一直在那里工作。在此之前,他曾在Oracle公司定制开发部担任了三年以上的首席顾问。他所做的计算机工作包括在尼泊尔加德满都建立电子藏英词典,为高盛公司演示中心做支持,以及管理TIAA-CREF的交易系统。自1998年以来,Benjamin一直在纽约市哥伦比亚大学计算机技术与应用项目担任教师,在2002年,他被CTA项目的主席和董事授予“优秀教学奖”。他拥有里德学院的学士学位和哥伦比亚大学颁发的数据库开发和设计证书。他从前与Prentice Hall合著的书籍包括《Oracle Forms Developer:The Complete Video Course (2000)》和《Oracle Web Application Programming for PL/SQL Developers(2003)》。 Elena Rakhimov拥有超过20年的数据库架构和开发经验,曾服务于各种企业和商业环境,从非营利组织到华尔街到她目前在知名软件公司领导数据库团队的职位。尽管Elena决定从事“实际操作”,但她在学术领域也很有建树,她在哥伦比亚大学受到高度评价的计算机技术与应用项目中执教关系数据库编程。她曾在哥伦比亚大学学习数据库分析和设计,并在阿塞拜疆的巴库国立大学学习应用数学。她目前居住在加拿大温哥华。

Oracle PL/SQL实例精解(原书第5版) PDF下载

目录

目  录 Contents

译者序

前言

作者简介

致谢

第1章 PL/SQL概念 ; 1

1.1 实验1:PL/SQL架构 ; 1使用 ; 8

1.2.2 初步掌握SQL * Plus的使用 ; 10

1.2.3 执行PL/SQL脚本 ; 11

1.3 实验3:PL/SQL基础知识 ; 14

1.3.1 DBMS_OUTPUT.PUT_LINE语句 ; 14

1.3.2 替代变量功能 ; 17

1.4 总结 ; 21

第2章 PL/SQL语言基础 ; 22

2.1 实验:PL/SQL编程基础 ; 22

2.1.1 PL/SQL语言组件 ; 23

2.1.2 PL/SQL变量 ; 23

2.1.3 PL/SQL保留字 ; 26

2.1.4 PL/SQL中的标识符 ; 26

2.1.5 挂靠的数据类型 ; 27

2.1.6 声明和初始化变量 ;29

2.1.7 块作用域、嵌套块和标签 ;32

2.2 总结 ; 34

第3章 在PL/SQL中的SQL ; 35

3.1 实验1:在PL/SQL中的DML

 语句 ; 35

3.1.1 使用SELECT INTO初始化 变量 ; 36

3.1.2 使用变量初始化的SELECT  INTO语法 ; 37

3.1.3 在PL/SQL块中使用DML ; 38

3.1.4 在PL/SQL块中使用序列 ; 39

3.2 实验2:在PL/SQL中的事务 控制 ; 40

3.2.1 使用COMMIT、ROLLBACK和

 SAVEPOINT ; 40

3.2.2 将DML和事务控制相结合 ; 43

3.3 总结 ; 45

第4章 条件控制:IF语句 ; 46

4.1 实验1:IF语句 ; 46

4.1.1 IF-THEN语句 ; 47

4.1.2 IF-THEN-ELSE语句 ; 48

4.2 实验2:ELSIF语句 ; 50

4.3 实验3:嵌套的IF语句 ; 54

4.4 总结 ; 56

第5章 条件控制:CASE语句 ; 57

5.1 实验1:CASE语句 ; 57

5.1.1 CASE语句 ; 57

5.1.2 搜索CASE语句 ; 59

5.2 实验2:CASE表达式 ; 64

5.3 实验3:NULLIF和COALESCE

 函数 ; 67

5.3.1 NULLIF函数 ; 67

5.3.2 COALESCE函数 ; 69

5.4 总结 ; 71

第6章 迭代控制:第一部分 ; 72

6.1 实验1:简单循环 ; 72

6.1.1 EXIT语句 ; 73

6.1.2 EXIT WHEN语句 ; 76

6.2 实验2:WHILE循环 ; 77

6.2.1 使用WHILE循环 ; 77

6.2.2 提前终止WHILE循环 ; 80

6.3 实验3:数字FOR循环 ; 81

6.3.1 在循环中使用IN选项 ; 82

6.3.2 在循环中使用REVERSE选项 ; 84

6.3.3 提前终止数字FOR循环 ; 84

6.4 总结 ; 85

第7章 迭代控制:第二部分 ; 86

7.1 实验1:CONTINUE语句 ; 86

7.1.1 使用CONTINUE语句 ; 86

7.1.2 CONTINUE WHEN语句 ; 89

7.2 实验2:嵌套循环 ; 92

7.2.1 使用嵌套循环 ; 92

7.2.2 使用循环标签 ; 93

7.3 总结 ; 95

第8章 错误处理和内置异常 ; 96

8.1 实验1:处理错误 ; 96

8.2 实验2:内置异常 ; 98

8.3 总结 ; 103

第9章 异常 ; 104

9.1 实验1:异常作用域 ; 104

9.2 实验2:用户定义的异常 ; 107

9.3 实验3:异常传播 ; 111

9.4 总结 ; 116

第10章 异常:高级概念 ; 117

10.1 实验1:RAISE_APPLICATION

 ERROR ; 117

10.2 实验2:EXCEPTION_INIT

 编译指示 ; 120

10.3 实验3:SQLCODE和

 SQLERRM ; 122

10.4 总结 ; 124

第11章 游标简介 ; 125

11.1 实验1:游标类型 ; 125

11.1.1 使用隐式游标 ;126

11.1.2 使用显式游标 ;127

11.2 实验2:游标循环 ; 130

11.2.1 处理显式游标 ;130

11.2.2 使用用户定义的记录 ;133

11.2.3 使用游标属性 ;134

11.3 实验3:游标FOR循环 ; 138

11.4 实验4:嵌套游标 ; 139

11.5 总结 ; 143

第12章 高级游标 ; 144

12.1 实验1:参数化游标 ; 144

12.2 实验2:复杂的嵌套游标 ; 145

12.3 实验3:FOR UPDATE和WHERE CURRENT游标 ; 147

12.3.1 FOR UPDATE游标 ; 147

12.3.2 游标中的FOR UPDATE 触发器 ; 151

13.1.1 数据库触发器 ;151

13.1.2 BEFORE触发器 ; 154

13.1.3 AFTER触发器  159

13.1.4 自治事务  160

13.2 实验2:触发器类型  162

13.2.1 行触发器和语句触发器 162

13.2.2 INSTEAD OF触发器  163

13.3 总结  167

第14章 变异表和复合触发器  168

14.1 实验1:变异表  168

14.1.1 什么是变异表 168

14.1.2 解决变异表问题 170

14.2 实验2:复合触发器  172

14.2.1 什么是复合触发器 172

14.2.2 解决变异表问题的复合

 触发器  174

14.3 总结  177

第15章 集合  178

15.1 实验1:PL/SQL表  178

15.1.1 关联数组  179

15.1.2 嵌套表  181

15.1.3 集合方法  184

15.2 实验2:变长数组  187

15.3 实验3:多级集合  190

15.4 总结  192

第16章 记录  193

16.1 实验1:记录类型  193

16.1.1 基于表和基于游标的记录 194

16.1.2 用户定义的记录 196

16.1.3 记录兼容性  197

16.2 实验2:嵌套记录  199

16.3 实验3:记录集合  202

16.4 总结  205

第17章 本地动态SQL  206

17.1 实验1:EXECUTE IMMEDIATE语句  206

17.1.1 使用EXECUTE IMMEDIATE

 语句  207

17.1.2 如何避免使用EXECUTE

 IMMEDIATE的常见ORA错误  209

17.2 实验2:OPEN-FOR、FETCH和

 CLOSE语句  216

17.2.1 打开游标  216

17.2.2 从游标中读取 217

17.2.3 关闭游标  217

17.3 总结  223

第18章 批量SQL  224

18.1 实验1:FORALL语句  224

18.1.1 使用FORALL语句  225

18.1.2 SAVE EXCEPTIONS选项  228

18.1.3 INDICES OF选项  230

18.1.4 VALUES OF选项  230

18.2 实验2:BULK COLLECT子句  232

18.3 实验3:在SQL语句中绑定集合  239

18.3.1 将集合与EXECUTE IMMEDIATE语句绑定  240

18.3.2 将集合与OPEN-FOR、FETCH和CLOSE语句绑定 245

18.4 总结  248

第19章 过程  249

19.1 模块化代码的好处 249

19.1.1 块结构  250

19.1.2 匿名块  250

19.2 实验1:创建过程  250

19.2.1 实践创建过程的语法 251

19.2.2 查询数据字典来获取过程的

 信息  252

19.3 实验2:传递的过程参数IN和

 OUT  253

19.4 总结  255

第20章 函数  256

20.1 实验1:创建函数  256

20.1.1 创建存储函数 257

20.1.2 使用函数  259

20.2 实验2:在SQL语句中使用函数  260

20.2.1 在SQL语句中调用函数  261

20.2.2 编写复杂函数 261

20.3 实验3:在SQL中优化函数执行  262

20.3.1 使用WITH子句定义函数  262

20.3.2 使用UDF编译指示创建函数  263

20.4 总结  263

第21章 包  264

21.1 实验1:创建包  264

21.1.1 创建包规范  265

21.1.2 创建包体  267

21.1.3 调用已存储的包 269

21.1.4 创建私有对象 270

21.2 实验2:游标变量  274

21.3 实验3:扩展包  281

21.4 实验4:包的实例化和初始化  292

21.5 实验5:SERIALLY_REUSABLE包  294

21.6 总结  296

第22章 存储代码  297

22.1 实验:收集存储代码的相关信息 297

22.1.1 从数据字典获取存储代码的信息 297

22.1.2 重载模块  300

22.2 总结  305

第23章 Oracle对象类型  306

23.1 实验1:对象类型  306

23.1.1 创建对象类型 308

23.1.2 使用对象类型与集合 310

23.2 实验2:对象类型的方法  314

23.2.1 构造方法  314

23.2.2 成员方法  316

23.2.3 静态方法  317

23.2.4 比较对象  318

23.3 总结  322

第24章 Oracle提供的包  323

24.1 实验1:利用Oracle提供的包扩展功能  323

24.1.1 在PL/SQL中利用UTL_FILE访问文件  324

24.1.2 利用DBMS_JOB调度作业  327

24.1.3 利用DBMS_XPLAN生成解释计划  329

24.1.4 利用DBMS_SQL产生隐式语句结果  333

24.2 实验2:利用Oracle提供的包报告错误  334

24.2.1 利用DBMS_UTILITY包报告错误  334

24.2.2 利用UTL_CALL_STACK

前沿

前  言?Preface本书用一种独特的风格介绍了Oracle的PL/SQL程序设计语言。它促使你通过使用Oracle PL/SQL,而不只是通过阅读来学习它。 正如语法手册通过首先展示名词和动词的示例,然后要求你写句子来讲解它们,本书也通过首先展示游标、循环、过程、触发器等的示例,要求你自己创建这些对象来讲解它们。 本书的目标读者本书是为那些需要快速地详细了解Oracle的PL/SQL语言编程的人员准备的。理想的读者是那些具有以下条件的人员:他们有某些关系数据库的经验,具有一定的Oracle经验,特别是SQL、SQL * Plus和SQL Developer,但对于PL/SQL或大多数其他编程语言只有很少的经验或根本没有经验。 本书的内容主要基于纽约市哥伦比亚大学计算机技术与应用(CTA)项目的PL/SQL导论课程教学素材。学生的层次是相当不同的,因为有一些学生具有多年的信息技术(IT)和编程经验,但没有Oracle PL/SQL方面的经验,还有一些学生则完全没有IT或编程经验。与这门课一样,本书内容兼顾了这两种极端的需求。配套网站上的补充练习可以作为讲解这样一门PL/SQL课程的配套实验和家庭作业。 本书的组织结构本书旨在首先通过解释编程概念或特定的PL/SQL功能,然后通过示例进一步说明它来教会你使用Oracle PL/SQL。通常情况下,当讨论更深入的主题时,这些示例将被修改,以说明新涉及的内容。此外,本书的大多数章节都具有可在配套网站获得的补充练习部分。这些练习可以帮助你测试对新内容的理解程度。 每章的基本结构都如下: 目标简介实验实验总结目标部分列出此章所包含的主题。基本上每个目标都对应于一个实验。 简介提供该章涉及的概念和功能的简要概述。 每个实验都涵盖了在该章的目标部分列出的一个目标。在一些情况下,在实验中,目标被进一步分解为更小的单个主题。然后每个这样的主题都借助示例和相应的输出来说明和展示。需要注意的是,每个示例都尽可能完整地提供,这使得其代码是现成可用的。 每章最后都有一个总结,它对此章讨论的内容进行了简要总结。此外,“顺便说说”部分会说明某个特定章节是否有配套网站上的补充练习。 关于配套网站配套网站位于informit.com/title/0133796787。你会在那里发现三项非常重要的内容: 创建和安装STUDENT模式所需要的文件。 包含本书各章使用的示例脚本的文件。 补充练习的章节,其中有两部分: “问与答”部分,其中包含某个特定的章所介绍内容的相关问题,以及这些问题的参考答案。通常情况下,要求你基于一些需求修改一个脚本,并解释这些修改造成的输出差异。请注意,这部分也被组织成与书中的相应章节类似的实验。 “试一试”部分,要求你根据给定的需求来创建脚本。此部分与“问与答”部分不同,没有给这些问题提供任何脚本。相反,你需要自己创建全部脚本。 顺便说说如果想执行各章节和网站上提供的脚本,需要在使用本书之前访问配套网站,下载student模式,并将其安装在数据库中。 先决条件完成本书中的实验既需要有软件程序,也需要有必要的知识。需要注意的是,本书涉及的一些功能只适用于Oracle 12c。但是,只要利用下列产品,就能够运行绝大部分的示例并完成补充练习和“试一试”部分: Oracle 11g或更高版本。 SQL Developer或SQL * Plus 11g或更高版本。 接入互联网。 你可以使用Oracle个人版或Oracle企业版来执行本书的示例。如果你使用Oracle企业版,则可以在一台远程服务器或自己的本地机器上运行。建议你使用Oracle 11g或Oracle 12c,以便执行本书全部或大部分的示例。当某个功能仅适用于Oracle数据库的最新版本时,本书会明确地说明。此外,你应该能够使用并熟悉SQL Developer或SQL * Plus。 关于如何在SQL Developer或SQL * Plus中编辑和运行脚本有许多选择。也有许多可用来编辑和调试PL/SQL代码的第三方程序。本书中同时采用了SQL Developer和SQL * Plus来说明,因为这两者都是Oracle提供的工具,并作为Oracle安装的一部分提供。 顺便说说第1章具有名为“PL/SQL开发环境”这样一个实验,它介绍了如何开始使用SQL Developer和SQL * Plus。然而,本书使用的绝大多数示例都在SQL Developer中执行。 关于示例模式STUDENT模式包含表和其他对象,用来保存一个虚构大学的注册和登记系统的相关信息。系统中有10个表,分别存储学生、课程、教师等的相关数据。除了存储学生和教师的联系信息(地址和电话号码),以及有关课程的描述性信息(费用和先决课程)之外,本模式还记录特定课程的课班(section),以及学生已经就读的课班。 SECTION表是在本模式中最重要的表之一,因为它存储有关已为每门课程创建的各个课班的数据。每个课班记录还存储此课班在哪里及何时上课,以及哪位教师会教授此课班的信息。SECTION表与COURSE和INSTRUCTOR表相关。 ENROLLMENT表是同样重要的,因为它记录哪些学生就读于哪些课班。每个入学记录还存储有关学生的成绩和注册日期信息。ENROLLMENT表与STUDENT和SECTION表相关。 STUDENT模式还有其他几个表来管理在每个课班中的每个学生的成绩。 STUDENT模式的详细结构参见附录B。 Oracle 12c PL/SQL新特性简介Oracle 12c已经为PL/SQL引入了许多新特性和改进。这里简要介绍了未在本书中讨论的特性,并指出了本书涉及的特性所在的具体章节。在作为Oracle联机帮助的一部分提供的《PL/SQL Language Reference》手册的“Changes in This Release for Oracle Database PL/SQL Language Reference”一节也可找到这里描述的特性清单。 PL/SQL的新特性和改进如下: 调用者权限函数可缓存结果。 PL/SQL独有的更多数据类型可以跨越PL/SQL到SQL的接口子句。 ACCESSIBLE BY子句。 FETCH FIRST子句。 可将角色授予PL/SQL包和独立子程序。 更多的数据类型在SQL和PL/SQL中具有相同的最大大小。 可插拔数据库上的数据库触发器。 LIBRARY可定义为DIRECTORY对象,并可带有CREDENTIAL子句。 隐式语句结果。 BEQUEATH CURRENT_USER视图。 INHERIT PRIVILEGES和INHERIT ANY PRIVILEGES特权。 不可见列。 对象,而不是类型,是有版次或无版次的。 在SQL中运行得更快的PL/SQL函数。 预定义的查询指令$$ PLSQL_UNIT_OWNER和$$ PLSQL_UNIT_TYPE。 编译参数PLSQL_DEBUG已弃用。 调用者权限函数可缓存结果在Oracle产品中创建存储子程序时,可把它创建为定义者权限(Def?iner Right,DR)单元或调用者权限(Invoker Right,IR)单元。DR单元将以其所有者的权限执行,而IR单元将以调用该特定单元的用户权限执行。默认情况下,除非明确指定,否则存储子程序都将创建为DR单元。一个特定单元是被当作DR还是IR单元由AUTHID属性来控制,此属性可以设置为DEFINER(默认)或CURRENT_USER。 在Oracle 12c之前,使用调用者权限子句(AUTHID CURRENT_USER)创建的函数不能缓存结果。要创建作为IR单元的函数,必须把AUTHID子句添加到函数规范中。 结果缓存函数是其参数值和结果都存储在缓存中的函数。因此,使用相同的参数值来调用这样的函数时,其结果是从缓存中提取的,而不是重新计算的。要对某个函数启用结果缓存,必须把RESULT_CACHE子句添加到函数规范中,如以下例子所示(调用者权限子句和结果缓存子句以粗体突出显示)。 示例 以调用者权限创建的结果缓存函数请注意,如果学生ID为230的学生记录已经在结果缓存中,那么此函数将从结果缓存返回学生记录。在相反的情况下,将从STUDENT表选择该学生记录并将其添加到缓存以供将来使用。因为函数的结果缓存依赖于STUDENT表,所以对STUDENT表实施并提交的任何修改都会使get_student_rec函数的所有缓存结果变得无效。 PL/SQL独有的更多数据类型可以跨越PL/SQL到SQL的接口子句在此版本中,Oracle已经在动态SQL和客户端程序(OCI或者JDBC)中扩展了对PL/SQL独有的数据类型的支持。例如,可以在使用EXECUTE IMMEDIATE语句或OPEN FOR、FETCH和CLOSE语句时绑定集合变量。18.3节对本主题进行了更详细的介绍。 ACCESSIBLE BY子句可选的ACCESSIBLE BY子句允许指定可访问正在创建或修改的PL/SQL单元的PL/SQL单元列表。ACCESSIBLE BY子句通常被加入到模块头部,例如,函数或过程头部。在ACCESSIBLE BY子句中列出的每个单元都称为访问器,而该子句本身也称为白名单,如以下例子所示(ACCESSIBLE BY子句以粗体显示)。 示例 使用ACCESSIBLE BY子句创建的存储过程在此示例中,有两个过程,test_proc1和test_proc2,并且test_proc1是使用ACCESSIBLE BY子句创建的。其结果是,test_proc1只能由test_proc2访问。这由两个匿名PL/SQL块体现。第一个块执行test_proc2成功。第二个块试图直接执行test_proc1,但其结果出错。 请注意,这两个过程都是在单个模式(STUDENT)中创建的,并且这两个PL/SQL块都是在所有者(STUDENT)的单个会话中执行的。 FETCH FIRST子句FETCH FIRST子句是一个新的可选特性,它通常用在“前N个”查询中,如以下例子所示。本例使用的ENROLLMENT(登记)表包含学生注册数据。每名学生都是通过一个唯一的学生ID标识的,并可注册多个课程。FETCH FIRST子句以粗体显示。 示例 使用FETCH FIRST子句进行“前N个”查询请注意FETCH FIRST子句也可与BULK COLLECT INTO子句结合使用,如下所示。FETCH FIRST子句以粗体显示。 示例 将FETCH FIRST子句与BULK COLLECT INTO子句结合使用可将角色授予PL/SQL程序包和独立子程序从Oracle 12c开始,可以将角色授予PL/SQL包和独立子程序。需要注意的是,将一个角色授予PL/SQL包或独立子程序不改变其编译。相反,它会影响由PL/SQL单元在运行时发出的SQL语句所需权限的检查方式。 考虑以下例子,其中READ角色被授予get_student_name函数。 示例 将READ角色授予get_student_name函数更多的数据类型在SQL和PL/SQL中具有相同的最大大小在Oracle 12c之前,某些数据类型在SQL和PL/SQL中有不同的最大大小。例如,NVARCHAR2在SQL中的最大大小是4000字节,而在PL/SQL中是32?767字节。从Oracle 12c开始,VARCHAR2、NVARCHAR2和RAW数据类型在SQL和PL/SQL中的最大大小都已经扩展到了32?767字节。要在SQL中使用这些最大大小,初始化参数MAX_STRING_SIZE必须设置为EXTENDED。 可插拔数据库上的数据库触发器可插拔数据库(PDB)是Oracle的多租户架构的组成部分之一。通常它是可移植的模式和其他数据库对象的一个集合。从Oracle 12c开始,可以在PDB上创建事件触发器。触发器的详细信息是在第13章和第14章提供的,请注意,PDB是在本书范围之外的,但它们的详细信息可在Oracle的联机《Administration Guide》(管理指南)中找到。 LIBRARY可定义为DIRECTORY对象,并可带有CREDENTIAL子句LIBRARY(库)是与操作系统的共享库相关联的模式对象。它是在CREATE OR REPLACE LIBRARY语句的帮助下创建的。 DIRECTORY(目录)也是将一个别名映射到服务器文件系统的实际目录上的对象。第25章很简要地提及了DIRECTORY对象,这是作为PL/SQL剖析器API和PL/SQL层次式剖析器安装过程的一部分介绍的。在Oracle 12c版本中,LIBRARY对象可以定义为一个带有可选CREDENTIAL子句的DIRECTORY对象,如下所示。 示例 把LIBRARY创建为DIRECTORY对象在本例中,LIBRARY对象my_lib被创建为DIRECTORY对象。plsql_code是DIRECTORY对象my_dir中的动态链接库(DDL)的名称。请注意,要成功地创建这个库,必须预先创建DIRECTORY对象my_dir。LIBRARY和DIRECTORY对象的详细信息可以在Oracle的联机《Database PL/SQL Language Reference》(数据库PL/SQL语言参考)中找到。 隐式语句结果在Oracle 12c版本之前,SQL查询的结果集是通过REF CURSOR输出参数从存储的PL/SQL子程序明确地返回的。其结果是,调用者程序必须绑定到REF CURSOR参数并明确地提取结果集。 从此版本开始,REF CURSOR输出参数可以由DBMS_SQL包的两个过程,RETURN_RESULT和GET_NEXT_RESULT来代替。这些过程使能存储的PL/SQL子程序隐式地返回SQL查询的结果集,如下例所示(对RETURN_RESULT过程的引用以粗体突出显示): 示例 使用DBMS_SQL.RETURN_RESULT过程在本例中,test_return_result过程将教师的名字和姓氏隐式地返回客户端应用程序。需要注意的是,游标SELECT语句使用了FETCH FIRST ROW ONLY子句,这也是在Oracle 12c中引入的。要成功地从test_return_result过程获得结果集,客户端应用程序必须同样升级到Oracle 12c。否则,它将返回以下错误消息: BEQUEATH CURRENT_USER视图在Oracle 12c中,视图只可以创建为定义者权限单元。从12c版本开??始,视图也可以创建为一个调用者权限单元(这类似于存储子程序的AUTHID属性)。但是,对于视图,这种行为是通过在创建它的时候指定BEQUEATH DEFINER(默认值)或BEQUEATH CURRENT_USER子句达成的,如以下例子所示(BEQUEATH CURRENT_USER子句以粗体显示): 示例 使用BEQUEATH CURRENT_USER子句创建视图在本例中,my_view创建为IR单元。请注意,将这个属性添加到视图中并不影响它的主要用途。相反,类似于AUTHID属性,它确定从该视图选择数据的时候将应用哪组权限。 INHERIT PRIVILEGES(继承特权)和INHERIT ANY PRIVILEGES(继承任何特权)特权从Oracle 12c开始,只有当某个调用者权限单元的所有者具有INHERIT PRIVILEGES或INHERIT ANY PRIVILEGES特权时,该单元才会以调用者的权限执行。例如,在Oracle 12c之前,假设user1把一个函数F1创建为一个调用者权限单元,并把对它执行的权限授予正好有比user1更多特权的用户user2。然后,当user2运行F1函数时,该函数将以user2的权限运行,这可能会执行user1也许没有权限执行的操作。在Oracle 12c中,情况已不再是这样。如前所述,这样的行为必须明确地通过INHERIT PRIVILEGES或INHERIT ANY PRIVILEGES特权来指定。 不可见列从Oracle 12c开始,可以定义和操作不可见列。在PL/SQL中,定义为%ROWTYPE的记录能意识到这样的列,如以下例子所示(对不可见列的引用以粗体显示): 示例 %ROWTYPE记录和不可见列正如这个例子所展示的,由于引用了不可见列,匿名PL/SQL块的第一次运行未能完成。一旦再次把NUMERIC_GRADE列设置为可见,脚本就能够成功完成。 对象,而不是类型,是有版次或无版次的版本是基于版本的重定义功能的一个组成部分,这种功能允许你创建对象的一个副本(例如,PL/SQL包),并对它进行更改,而不影响可能依赖于它的其他对象或使之无效。随着此功能的引入,在数据库中创建的对象可以定义为有版次或无版次的。对于有版次的对象,其对象类型必须是有版次的,它必须有EDITIONABLE属性。同样,对于无版次的对象,其对象类型必须是无版次的或者它必须有NONEDITIONABLE属性。 从Oracle 12c开始,你能够在CREATE OR REPLACE和ALTER语句中指定某个模式对象是有版次的或无版次的。在这个新版本中,已启用版次的用户(模式),即使它在数据库中的类型是有版次的,但只要在模式本身中的类型是无版次的或如果此对象具有NONEDITIONABLE属性,它就能够拥有一个无版次对象。 在SQL中运行得更快的PL/SQL函数从Oracle 12c开始,可以在SQL语句中创建调用时可能运行得更快的用户定义的函数。这可以用如下方法完成: 在SELECT语句的WITH子句中声明用户定义的函数。 使用UDF编译指示创建用户定义的函数。 考虑下面的示例,其中的format_name函数是在SELECT语句的WITH子句中创建的。这个新创建的函数返回格式化的学生姓名。 示例 在WITH子句中创建一个用户定义的函数接下来,考虑用UDF编译指示创建format_name函数的另一个示例。 示例 在UDF编译指示中创建一个用户定义的函数预定义的查询指令$$PLSQL_UNIT_OWNER和$$PLSQL_UNIT_TYPE在PL/SQL中,有大量预定义的查询指令,如下表所述(为了强调,$$PLSQL_UNIT_OWNER和$$PLSQL_UNIT_TYPE以粗体显示): 名  称 说  明$$PLSQL_LINE 它是出现在PL/SQL子程序中的代码行的编号$$PLSQL_UNIT PL/SQL子程序的名称。对于匿名PL/SQL块,它设置为NULL$$PLSQL_UNIT_OWNER 12c版本中新增的指令。它是PL/SQL子程序的所有者(模式)。对于匿名PL/SQL块,它设置为NULL$$PLSQL_UNIT_TYPE 12c版本中新增的指令。它是PL/SQL子程序的类型——例如,FUNCTION、PROCEDURE或PACKAGE BODY$$plsql_compilation_parameter 一组PL/SQL编译参数,其中有些是PLSQL_CODE_TYPE,它指定PL/SQL子程序的编译模式。而另外一些是PLSQL_OPTIMIZE_LEVEL(将在第25章探讨)下面的示例演示了指令的可能用法。 示例 使用预定义的查询指令编译参数PLSQL_DEBUG已弃用从Oracle 12c版本开始,PLSQL_DEBUG参数已弃用。若要为了调试而编译PL/SQL子程序,PLSQL_OPTIMIZE_LEVEL参数应设置为1。第25章非常详细地讨论了PLSQL_OPTIMIZE_LEVEL参数和PL/SQL性能优化器支持的各种优化级别。

Oracle PL/SQL实例精解(原书第5版) pdf下载声明

本pdf资料下载仅供个人学习和研究使用,不能用于商业用途,请在下载后24小时内删除。如果喜欢,请购买正版

pdf下载地址

版权归出版社和作者所有,下载链接已删除。如果喜欢,请购买正版!

链接地址:Oracle PL/SQL实例精解(原书第5版)