首页>参考读物>计算机科学与技术>数据库

Oracle PL/SQL实例精解(原书第5版)
作者 : [美]本杰明·罗森维格(Benjamin Rosenzweig),[加]艾琳娜·拉希莫夫(Elena Rakhimov) 著
译者 : 卢涛 译
丛书名 : 数据库技术丛书
出版日期 : 2016-03-18
ISBN : 978-7-111-52887-6
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 396
开本 : 16
原书名 : Oracle PL/SQL by Example,Fifth Edition
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

图书特色

资深Oracle技术专家深度探索PL/SQL编程技术及最佳实践,涵盖Oracle 12c的最新特性
使用真实场景的实验、大量示例、练习和项目来讲解你所需的PL/SQL编程技能,涵盖从基础语法、程序控制到最新的优化和安全增强等方面的知识

使用Oracle数据库12c的PL/SQL,你可以构建在任何环境(包括云环境)下都提供前所未有的性能和效率的解决方案。本书通过真实场景的实验、大量的示例、练习和项目来讲解你所需的全部PL/SQL技能。本版根据PL/SQL的最新版本进行了全面更新,涵盖从基础语法、程序控制到最新的优化和安全增强等方面的知识。
你可以通过本书独立学习每个关键任务,以及当今最有价值的Oracle 12c的PL/SQL编程技术。从informit.com/title/0133796787下载项目和练习,每当你完成一个练习,可以分享作者的解决方案,这些解决方案提供深度探索视角和已证实的最佳实践。
本书的写作手法充分反映了作者在哥伦比亚大学向专业人员讲授PL/SQL编程的经验和技巧。通过这种逐步分解的讲解方式,数据库开发者和DBA的新手可以更快地获得实践经验;有经验的PL/SQL程序员可以把本书作为很好的Oracle数据库12c实践性解决方案的参考资源。

通过阅读本书,你将学到:
掌握PL/SQL的基本概念和语言基础知识,理解SQL在PL/SQL中的作用
使用条件和迭代程序控制,包括CONTINUE和CONTINUE WHEN
高效地处理错误和异常
使用游标和触发器,包括复合触发器。
使用存储过程、函数和包来编写其他程序可以运行的模块化代码
使用集合、对象-关系功能、本地动态SQL、批量SQL和其他高级功能

本版更新内容:
全面更新的代码示例
利用调用者权限函数的结果缓存来提高性能
动态SQL、OCI和JDBC对仅在PL/SQL中有效的数据类型的扩展支持
安全性增强,包括ACCESSIBLE BY白名单、改进的特权控制,以及不可见列

作者简介

Benjamin Rosenzweig
现任Misys财务软件公司高级项目经理。在此之前,他曾在Oracle公司担任定制开发部的首席顾问。他的工作经历包括在尼泊尔加德满都市开发藏英电子词典、为高盛公司的演示中心做支持,以及管理TIAA-CREF的交易系统。自1998年以来,Benjamin一直在纽约市哥伦比亚大学计算机技术与应用项目担任教师,在2002年,他被CTA项目的主席和董事授予“优秀教学奖”。

Elena Rakhimov
拥有超过20年的数据库架构和开发经验,涉及非营利组织和华尔街等各种企业和商业环境,她目前在一家知名软件公司领导数据库团队。她在哥伦比亚大学讲授关系数据库编程。

内容简介
本书是一本逐步分解的、详尽的PL/SQL编程教程,使用真实场景的实验、大量示例、练习和项目来介绍读者所需的PL/SQL编程技能,涵盖oracle 12c的最新特性。作者的写作手法源自于在哥伦比亚大学教授PL/SQL编程技术的经验,深度探索PL/SQL编程技术及最佳实践。通过使用本书,你可以快速掌握PL/SQL编程基本知识,并建立工程化的概念,提升实际问题解决能力。
全书共25章,第1章介绍PL/SQL的架构、开发环境和基础知识;第2章讲解PL/SQL编程基础;第3章介绍PL/SQL中的DML语句和事务控制;第4章和第5章介绍条件控制,包括IF语句和CASE语句;第6章和第7章探讨循环,包括简单循环、WHILE循环、数值FOR循环、CONTINUE语句和CONTINUE WHEN语句,以及如何互相嵌套不同类型的循环;第8~10章深入探讨错误处理和异常的概念及处理方法,包括错误处理、内置异常、异常的作用域和传播,以及如何定义和引发自己的异常,如何重新引发异常等;第11章和第12章介绍游标,涉及游标的基本概念、参数化游标、嵌套游标及FOR UPDATE和WHERE CURRENT游标;第13章和第14章探讨触发器的概念、变异表和复合触发器;第15章介绍集合,包括PL/SQL表、变长数组和多级集合等;第16章介绍记录类型、嵌套记录和记录集合;第17章讲解如何创建和使用动态SQL;第18章介绍如何使用批量SQL功能来优化PL/SQL代码;第19章简要介绍存储过程;第20章介绍存储函数的基础知识;第21章详细介绍包,包括创建包、游标变量、扩展包、包的实例化和初始化等;第22章介绍收集存储代码的相关信息,以及如何重载函数和过程;第23章介绍Oracle对象类型;第24章介绍Oracle提供的几个主要的包;第25章介绍PL/SQL调优工具、优化级别,以及子程序内联。

图书前言

本书用一种独特的风格介绍了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数据库12c的PL/SQL,你可以构建在任何环境(包括云环境)下都提供前所未有的性能和效率的解决方案。本书通过真实场景的实验、大量的示例、练习和项目来讲解所需的全部PL/SQL技能。本版根据PL/SQL的最新版本进行了全面更新,涵盖从基础语法、程序控制到最新的优化和安全增强等方面的知识。
你可以通过本书独立学习每个关键任务,以及当今最有价值的Oracle 12c的PL/SQL编程技术。从informit.com/title/0133796787下载项目和练习,每当你完成一个练习,可以分享作者的解决方案,这些解决方案提供深度探索视角和已证实的最佳实践。
本书的写作手法充分反映了作者在哥伦比亚大学向专业人员讲授PL/SQL编程的经验和技巧。通过这种逐步分解的讲解方式,数据库开发者和DBA的新手可以更快地获得实践经验;有经验的PL/SQL程序员可以把本书作为很好的Oracle数据库12c实践性解决方案的参考资源。
通过阅读本书,你将学到:
掌握PL/SQL的基本概念和语言基础知识,理解SQL在PL/SQL中的作用
使用条件和迭代程序控制,包括CONTINUE和CONTINUE WHEN
高效地处理错误和异常
使用游标和触发器,包括复合触发器。
使用存储过程、函数和包来编写其他程序可以运行的模块化代码
使用集合、对象-关系功能、本地动态SQL、批量SQL和其他高级功能

本版更新内容:
全面更新的代码示例
利用调用者权限函数的结果缓存来提高性能
动态SQL、OCI和JDBC对仅在PL/SQL中有效的数据类型的扩展支持
安全性增强,包括ACCESSIBLE BY白名单、改进的特权控制,以及不可见列

作者简介

[美]本杰明·罗森维格(Benjamin Rosenzweig),[加]艾琳娜·拉希莫夫(Elena Rakhimov) 著:暂无简介

译者简介

卢涛 译:暂无简介

译者序

这是我翻译的第3本关于Oracle PL/SQL的书籍。第1本——《Oracle PL/SQL实战》适合有一定PL/SQL基础的读者,省略了基础内容。第2本——《精通Oracle Database 12c SQL & PL/SQL编程》主要讲解Oracle SQL,只介绍了部分PL/SQL基础知识。而本书比前两本更全面、更系统,它由浅入深地详细讲解PL/SQL,基本上涵盖了PL/SQL开发各个方面的内容,包括最新的Oracle 12c版本中新增和增强的PL/SQL功能,这些新功能使得利用PL/SQL开发Oracle应用程序更加高效。本书还包含大量可运行的示例,便于读者理解和牢固掌握所学知识。
我要感谢妻子李颖,她主修英语专业,作为本书的第一读者,帮助我检查出很多生硬的译文,并把它们修改得更加通顺。她还承担了家务和培养教育孩子的重任,使我可以专心翻译本书。
还要感谢我的儿子卢令一,他在我翻译书稿时自己安静地读书和玩耍,放弃了很多出去玩的机会,本书也有他的一份功劳。
感谢机械工业出版社的李艺编辑,她对译文进行把关,并对语言进行润色,使本书可读性更好。
希望本书能帮助读者提高Oracle PL/SQL开发水平。由于译者经验和水平有限,译文中难免有不妥之处,恳请读者批评指正!

卢 涛

图书目录

译者序
前言
作者简介
致谢
第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

教学资源推荐
作者: (葡)Luis Torgo 著
作者: 李丹 赵占坤 丁宏伟 石彦芳
作者: (美)Ramon A.Mata-Tloedo,Pauline K.Cushman
作者: 主编 李丹 赵占坤 丁宏伟 石建国 副主编 赵尔丹 钟莲 石彦芳
参考读物推荐
作者: 姜承尧 著
作者: [美]克里什·克里希南(Krish Krishnan)著
作者: Paul Dorsey等