1、程序员典藏大系Oracle PL/SQL 从入门到从入门到精通精通丁士锋 等编著清 华 大 学 出 版 社北 京内 容 简 介Oracle PL/SQL 从入门到精通 3本书以面向应用为原则,深入浅出地介绍了 Oracle 平台上使用 PL/SQL 语言进行数据库开发的技术。通过大量的示例,详细介绍了 PL/SQL 的语言特性、使用技巧,同时配以两个在实际工作中的案例深入地剖析了使用 PL/SQL 进行 Oracle 开发的方方面面。本书附带 1 张 DVD 光盘,内容为作者为本书录制的全程语音教学视频及本书所涉及的源代码。本书分为 5 大篇共 20 章。涵盖的内容主要有 PL/SQL 语言基
2、础、开发环境、变量与类型、控制语句、数据表的管理和查询、数据表的操纵、使用 PL/SQL 的记录与集合、各种内置函数、游标、事务处理、异常处理、子程序、包、面向对象的开发等技术点。通过示例性的代码,由浅入深,详细介绍了每一个技术要点在实际工作中的应用,对各种技术要点的应用场合进行了细致的分析。本书适合于使用 PL/SQL 进行应用程序开发的人员、对软件开发有兴趣的学生及爱好者阅读和参考;对数据库管理员、企业 IT 运维人员也具有很强的指导作用。本书封面贴有清华大学出版社防伪标签,无标签者不得销售。版权所有,侵权必究。侵权举报电话:010-62782989 13701121933图书在版编目(C
3、IP)数据Oracle PL/SQL 从入门到精通 / 丁士锋等编著. 北京:清华大学出版社,2012.6ISBN 978-7-302-28103-0 . O . 丁 . 关系数据库-数据库管理系统,Oracle . TP311.138中国版本图书馆 CIP 数据核字(2012)第 030492 号责任编辑:夏兆彦封面设计:责任校对:徐俊伟责任印制:出版发行:清华大学出版社网 址:http:/, http:/地 址:北京清华大学学研大厦 A 座 邮 编:100084社 总 机:010-62770175 邮 购:010-62786544投稿与读者服务:010-62776969, c-质量反馈:0
4、10-62772015,印 刷 者:装 订 者:肖 米经 销:全国新华书店开 本:185mm260mm 印 张:42.25 字 数:1055 千字(附 DVD 1 张)版 次:2012 年 6 月第 1 版 印 次:2012 年 6 月第 1 次印刷印 数:15000定 价:25.00 元产品编号:045147-01前 言为什么要写这本书随着计算机信息技术的飞速发展,数据存储已经成为很多公司越来越重视的问题。Oracle 公司的数据库管理软件以其稳定、高效和灵活性,一直是各大企事业单位后台存储的首选。Oracle 系统本身的复杂性,使得很多刚入门的开发人员不知从何入手,尽管Oracle 公司提
5、供了大量的文档,但是这些文档大多为英文版本,每个文档都偏重于某一技术细节,没有提供系统的、适合我国程序员思维的学习材料。目前在市面上关于 PL/SQL 的图书并不是很多,特别是由国内程序员经验总结的图书更是寥寥无几。本书作者站在一线开发人员的视角,通过简洁轻松的文字,简短精练的示例代码,以力求让不同层次的开发人员尽快掌握 Oracle 数据库开发为主旨编写了本书,同时在本书最后还提供了两个实战项目,让开发人员能够通过项目学习 PL/SQL 开发,提高实际开发水平和项目实战能力。本书有何特色1附带多媒体语音教学视频,提高学习效率为了便于读者理解本书内容,提高学习效率,作者专门为每一章内容都录制了
6、大量的多媒体语音教学视频。这些视频和本书涉及的源代码一起收录于配书光盘中。2涵盖 PL/SQL 语言的各种技术细节,提供系统化的学习思路本书涵盖了 PL/SQL 语言在实际项目中需要重点掌握的所有方面,包含语言基础、开发环境、常量和变量的定义、基本的控制结构、基本的 SQL 操作知识(比如查询、插入、修改和删除)、记录和集合、游标、SQL 的内置函数、事务处理、异常处理机制、子程序、包、触发器、面向对象的开发及动态 SQL 语句等知识点。3对 PL/SQL 开发的各种技术做了原理分析和实战体验全书使用简洁质朴的文字,配以大量的插图,将一些难以理解的原理部分进行了重点剖析,让读者不仅知晓实现的原
7、理,通过图形化的展现方式,更能加强对原理的理解,同时配以大量的示例对技术要点在实际工作中的应用进行了详解,让读者能尽快上手。4应用驱动,实用性强对于每段示例代码,都进行了仔细的锤炼,提供了各种实际应用的场景,力求让应用开发人员将这些知识点尽快应用到实际的开发过程中。5项目案例典型,实战性强,有较高的应用价值本书最后一篇提供了两个项目实战案例。这些案例来源于作者所开发的实际项目,具Oracle PL/SQL 从入门到精通 5有很高的应用价值和参考性。而且这些案例分别使用不同的 PL/SQL 技术实现,便于读者融会贯通地理解本书中所介绍的技术。这些案例稍加修改,便可用于实际项目开发中。6提供完善的
8、技术支持和售后服务本书提供了专门的技术支持邮箱:。读者在阅读本书过程中有任何疑问都可以通过该邮箱获得帮助。本书内容及知识体系第 1 篇 PL/SQL 开发入门(第 14 章)本篇介绍了 Oracle 的组成架构和 PL/SQL 开发的基础知识。主要包括 Oracle 体系结构、PL/SQL 开发环境、PL/SQL 的总体概览、常量和变量的定义,以及基本的 PL/SQL 控制 结构。第 2 篇 PL/SQL 开发基础(第 512 章)本篇是 PL/SQL 进行实际开发时必备的基础知识,包含使用 Oracle SQL 语句对数据表的查询、操纵;各种 Oracle 数据库对象的管理,比如同义词和序列
9、等;同时对 PL/SQL的记录与集合、各种 SQL 内置函数、游标、事务处理、锁定以及 PL/SQL 异常处理机制进行了详细的介绍。第 3 篇 PL/SQL 进阶编程(第 1316 章)本篇讨论了 PL/SQL 模块化编程相关的子程序、包、触发器的使用,这部分是实际工作中需要努力巩固的知识点,同时介绍了本地动态 SQL 技术的使用。这一篇的知识点是每个 PL/SQL 程序员必备的技能,在介绍形式上通过辅以大量与实际场景相结合的代码,提升开发人员的实战经验。第 4 篇 PL/SQL 高级编程(第 1718 章)本篇的内容针对已经熟练掌握了前面几篇的内容的开发人员,在具有了一定的PL/SQL 开发
10、经验后,可以通过本篇的内容学习使用面向对象的思维来开发 PL/SQL 应用程序,同时对于 PL/SQL 开发过程中的一些性能优化的注意事项进行了示例详解(提升开发人员的实战经验)。第 5 篇 PL/SQL 案例实战(第 1920 章)本篇通过两个实际的项目案例,从需求分析、数据库表的设计、系统的总体规划开始,到包规范的定义、包体的具体实现,详细剖析一个 PL/SQL 的实现生命周期,通过对这两个案例的一步一步深入体验,能让开发人员立即上手开始进行 PL/SQL 项目的开发。同时对这两个案例稍加修改,就能应用到实际的项目开发中。配书光盘内容介绍为了方便读者阅读本书,本书附带 1 张 DVD 光盘
11、,内容如下。 本书所有实例的源代码; 本书每章内容的多媒体语音教学视频; 免费赠送的 Oracle 入门教学视频。适合阅读本书的读者 需要全面学习 Oracle PL/SQL 开发技术的人员; 数据库开发程序员; 应用程序开发人员; Oracle 数据库管理人员; 希望提高项目开发水平的人员; 专业培训机构的学员; 软件开发项目经理; 需要一本 PL/SQL 案头必备查询手册的人员。阅读本书的建议 没有 Oracle PL/SQL 基础的读者,建议从第 1 章顺次阅读并演练每一个示例。 有一定 Oracle PL/SQL 基础的读者,可以根据实际情况有重点地选择阅读各个技术要点。 对于每一个知
12、识点和项目案例,先通读一遍有个大概印象,然后对于每个知识点的示例代码都在开发环境中操作一遍,加深对知识点的印象。 结合光盘中提供的多媒体教学视频再理解一遍,这样理解起来就更加容易,也会更加深刻。本书作者本书由丁士锋主笔编写。其他参与编写、资料整理和程序调试的人员有陈世琼、陈欣、陈智敏、董加强、范礼、郭秋滟、郝红英、蒋春蕾、黎华、刘建准、刘霄、刘亚军、刘仲义、柳刚、罗永峰、马奎林、马味、欧阳昉、蒲军、齐凤莲、王海涛、魏来科、伍生全、谢平、徐学英、杨艳、余月、岳富军、张健和张娜。在此一并表示感谢!笔者写作本书虽然耗费了大量精力,力争消灭错误,但恐百密难免一疏。若您在阅读本书的过程中发现任何问题,或
13、者有任何疑问,都可以随时提出,笔者将尽最大努力解决。联系邮箱:。编著者Oracle PL/SQL 从入门到精通 7第 5 章 管理数据表数据库表是 Oracle 数据库存储中基本但重要的部分,许多其他的数据库对象,例如索引、视图都以表为基础。在开发人员使用关系型数据库管理数据时,实际上就是通过创建一个或多个表来实现存储、约束等功能。5.1 创 建 表表是 Oracle 存储数据的基本单元,表与现实世界中的对象具有对应关系,在设计数据表时,一般使用 ER 图来构造实体关系模型, ER 图通常是对现实世界中的业务进行的建模。这些 ER 图在变成数据库对象时,最终要转换成表。数据库表又可称为二维数据
14、集合,表的结构由列(或字段)进行定义,列包含类型和一些约束信息,表行是这些列的数据,表中的行又称为记录,由一条记录来描述一个实例。5.1.1 数据定义语言 DDL用来创建表的 SQL 语言称为数据定义语言 DDL,DDL 的英文全称是 Data Definition Language,主要用来操纵 Oracle 数据库的结构。可以使用 DDL 语句定义、修改和删除在Oracle 中存在的每种类型的对象。数据定义语言主要由 CREATE、ALTER 与 DROP 3 个语句组成。1CREATE 语句CREATE 语句用来创建数据库对象,比如要创建数据库、数据表、索引或子程序、触发器等,根据创建的
15、数据库对象的类型的不同,具有多种不同的参数。例如可以使用 CREATE TABLE 创建一个数据库表,在下一小节会详细介绍创建的语法,或者可以使用 CREATE DATABASE 创建数据库,一些常见的使用 CREATE 语句的创建语法如下所示。CREATE INDEX:创建数据表索引。 CREATE PROCEDURE:创建存储过程。 CREATE FUNCTION:创建用户函数。 CREATE VIEW:创建视图。 CREATE TRIGGER:创建触发器。例如要创建一个公司的员工记录表,可以使用 CREATE TABLE,建表示例如代码 5.1所示。代码 5.1 使用 DDL 语句创建数
16、据表CREATE TABLE company_emp(empno NUMBER(4) PRIMARY KEY NOT NULL, -员工工号ename VARCHAR2(10 BYTE), -员工名称job VARCHAR2(9 BYTE), -员工职位mgr NUMBER(4), -所属经理hiredate DATE, -雇佣日期sal NUMBER(7,2), -员工工资comm NUMBER(7,2), -员工描述deptno NUMBER(2) -部门编码)从代码中可以看到,在 CREATE TABLE 语句中,定义了数据表的表列及 Oracle 数据表字段类型,该语句执行后,就可以在
17、当前用户方案下面看到 company_emp 表。2ALTER 语句ALTER 语句用来修改数据库对象,比如可以修改表、视图、索引、触发器的定义等,由于 ALTER 只需要修改数据库对象的局部,因此不需要定义完整的数据库对象参数,可以根据要修改的幅度来决定使用的参数,例如要向前面创建的表 company_emp 中添加一个名为 description 的列,可以使用如下的代码:ALTER TABLE company_emp ADD description VARCHAR2(200) NULL;-向 company_emp 添加表列上述代码中使用 ALTER TABLE 语句,向 company
18、_emp 表添加了一个名为description 的字段,该字段的类型为 VARCHAR2(200),允许 NULL 值。下面的代码同样使用 ALTER TABLE 语句来移除 description 字段:ALTER TABLE company_emp DROP COLUMN description; 上述代码中,使用了 ALTER TABLE 中的 DROP COLUMN 来移除 description 字段。3DROP 语句DROP 语句主要用来移除数据库对象,比如可以移除表、视图、索引等数据库对象,只需要在 DROP 语句后面输入要移除的对象名称即可,是 DDL 语法中最简单的语句。例
19、如要移除 company_emp 这个数据表,可以使用如下的 DROP 语法: DROP TABLE company_emp; -移除 company_emp 表所有的 DDL 语句的一个必须牢记的特色就是每一条 DDL 语句都包含了一个隐式提交的事务语句,因此只要这些命令执行,系统就会向数据库提交更改,所有具有访问数据库对象权限的用户马上就可以看到 DDL 语句的执行效果。注意: 在 PL/SQL 语句块中,不能直接使用 DDL 语句,可以通过动态 SQL 语句的形式来执行 SQL 命令。Oracle PL/SQL 从入门到精通 95.1.2 CREATE TABLE 语句CREATE TA
20、BLE 语句用来创建 Oracle 数据库表,创建数据库表最简单的形式是为CREATE TABLE 语句指定一个表名称,然后是括号包含起来的字段名称和字段类型。例如要创建一个简单的名为 workcenter 的表,可以使用如下的语法,如代码 5.2 所示。代码 5.2 简单的 CREATE TABLE 用法-创建表 workcenterCREATE TABLE workcenter -指定表名称( id int, -添加编号字段name varchar2(200) -添加名称字段)默认情况下,CREATE TABLE 会将表创建在当前的方案下,如果想在其他方案中创建数据表,那么可以使用“方案名
21、.表名称”这样的语法。例如如果想在 HR 方案中创建workcenter 数据表,可以使用如下的语法:-创建表 workcenterCREATE TABLE hr.workcenter -指定表名称( id int, -添加编号字段name varchar2(200) -添加名称字段)如果是使用 scott 用户登录,默认情况下是不能在 hr 方案之下创建表的,因此上述语句在执行时 Oracle 会触发 ORA-01031 异常。提示权限不足。 Toad 中的提示如图 5.1 所示。图 5.1 Toad 错误提示窗口通过使用如下所示的 GRANT 语句来为 scott 授予创建任何方案下的表、
22、视图和过程。GRANT CREATE ANY TABLE,CREATE ANY VIEW,CREATE ANY PROCEDURETO scott;注意: 在 Oracle 中,DDL 语句具有多种权限限制,一般只有具有管理员权限(DBA)才能建立数据库对象,不过通过 GRANT 和 REVOKE 语句,可以显式地为任何用户分配权限。在为数据库表命名时,应该遵循 Oracle 数据库对象的标准命名规则,如下所示。 表名和列名必须是具有描述性名称的字符串,以字母开头,且长度必须在 130个字符以内。 表名中只能包含字符 A Z、az、09、_(下划线)、 $和#(这两个字符虽然合法,但并不建议使
23、用)。 表名和列名不能与同一 Oracle 服务器用户拥有的其他对象重名。 表名和列名不能是 Oracle 服务器的保留字。注意: 表名和列表都是不区分大小写的。在 CREATE TABLE 语句的括号中,定义了列名,并使用 Oracle 内置的数据类型指定了列的类型,关于 Oracle 内置的数据类型,请参考本书第 3 章的内容。除了指定列的类型之外,还可以使用列类型属性来指定列的基本约束,常用的列特性有如下 3 个。 NOT NULL:指定列不接受 NULL 值,如果省略该值,列将允许接受 NULL 值。 UNIQUE:指定存储在列中的每一个值都必须唯一。 DEFAULT default_
24、value:指定列的默认值。例如下面的代码 5.3 使用 CREATE TABLE 语句创建了一个发票表 invoices,使用了列类型属性来对列进行基本的约束。代码 5.3 使用列约束创建表CREATE TABLE invoice(invoice_id NUMBER NOT NULL UNIQUE, -自动编号,唯一,不为空vendor_id NUMBER NOT NULL, -供应商 IDinvoice_number VARCHAR2(50) NOT NULL, -发票编号invoice_date DATE DEFAULT SYSDATE, -发票日期invoice_total NUMBE
25、R(9,2) NOT NULL, -发票总数payment_total NUMBER(9,2) DEFAULT 0 -付款总数)上述代码通过对列属性的使用,使得一些列的值不能为 NULL;一些列具有DEFALUT 指定的默认值;而一些列的值必须在整个表的相同的列中唯一。下面的语法是创建一个表的最基本的语法:CREATE TABLE schema_name.table_name(column_name_1 data_type column_attributes,column_name_2 data_type column_attributes.,table_level_constraints)Oracle 为表的创建提供了大量的参数,一些参数可能需要 DBA 来参与辅助设置,对于 PL/SQL 的开发人员来说,只需要了解这些基本的语法就可以完成很多的工作了。为了创建表,必须深入理解业务实体的数据类别及数据存储的容量,Oracle 内置了一系列的数据类型允许用户使用来创建一个表。在本书介绍 PL/SQL 数据类型时曾经介绍过,PL/SQL 支持访问所有的 Oracle 数据类型,Oracle 数据类型可分为标量、复合、引用和