
作为Oracle编程基础教材,本书力求言简意赅,重点突出。全书共分三部分:第Ⅰ部分引导读者对关系模型的基础知识进行回顾,并介绍Oracle SQL和PL/SQL基础知识。第Ⅱ部分在第Ⅰ部分的基础上引入Oracle Web编程的相关技术。第Ⅲ部分讲解Oracle支持的XML数据模型和查询语言。最后还为读者提供多个综合的数据库开发项目,用于巩固和提高所学的Oracle知识。
本书著述清楚,结构清晰,为初涉Oracle编程的学生和专业人士提供了理想的入门指导。
出 版 说 明
近年来,我国的高等教育特别是计算机学科教育,进行了一系列大的调整和改革,急需一批门类齐全、具有国际先进水平的计算机经典教材,以适应当前我国计算机科学的教学需要。通过使用国外先进的经典教材,可以了解并吸收国际先进的教学思想和教学方法,使我国的计算机科学教育能够跟上国际计算机教育发展的步伐,从而培育出更多具有国际水准的计算机专业人才,增强我国计算机产业的核心竞争力。为此,我们从国外知名的出版集团Pearson引进这套“国外经典教材·计算机科学与技术”教材。
作为全球最大的图书出版机构,Pearson在高等教育领域有着不凡的表现,其下属的Prentice Hall和Addison Wesley出版社是全球计算机高等教育的龙头出版机构。清华大学出版社与Pearson出版集团长期保持着紧密友好的合作关系,这次引进的“国外经典教材·计算机科学与技术”教材大部分出自Prentice Hall和Addison Wesley两家出版社。为了组织该套教材的出版,我们在国内聘请了一批知名的专家和教授,成立了一个专门的教材编审委员会。
教材编审委员会的运作从教材的选题阶段即开始启动,各位委员根据国内外高等院校计算机科学及相关专业的现有课程体系,并结合各个专业的培养方向,从Pearson出版的计算机系列教材中精心挑选针对性强的题材,以保证该套教材的优秀性和领先性,避免出现“低质重复引进”或“高质消化不良”的现象。
为了保证出版质量,我们为该套教材配备了一批经验丰富的编辑、排版、校对人员,制定了更加严格的出版流程。本套教材的译者,全部来自于对应专业的高校教师或拥有相关经验的IT专家。每本教材的责编在翻译伊始,就定期不间断地与该书的译者进行交流与反馈。为了尽可能地保留与发扬教材原著的精华,在经过翻译、排版和传统的三审三校之后,我们还请编审委员或相关的专家教授对文稿进行审读,以最大程度地弥补和修正在前面一系列加工过程中对教材造成的误差和瑕疵。
由于时间紧迫和受全体制作人员自身能力所限,该套教材在出版过程中很可能还存在一些遗憾,欢迎广大师生来电来信批评指正。同时,也欢迎读者朋友积极向我们推荐各类优秀的国外计算机教材,共同为我国高等院校计算机教育事业贡献力量。
清华大学出版社
国外经典教材·计算机科学与技术
编 审 委 员 会
主任委员:
孙家广 清华大学教授
副主任委员:
周立柱 清华大学教授
委员(按姓氏笔画排序):
王成山 天津大学教授
王 珊 中国人民大学教授
冯少荣 厦门大学教授
冯全源 西南交通大学教授
刘乐善 华中科技大学教授
刘腾红 中南财经政法大学教授
吉根林 南京师范大学教授
孙吉贵 吉林大学教授
阮秋琦 北京交通大学教授
何 晨 上海交通大学教授
吴百锋 复旦大学教授
李 彤 云南大学教授
沈钧毅 西安交通大学教授
邵志清 华东理工大学教授
陈 纯 浙江大学教授
陈 钟 北京大学教授
陈道蓄 南京大学教授
周伯生 北京航空航天大学教授
孟祥旭 山东大学教授
姚淑珍 北京航空航天大学教授
徐佩霞 中国科学技术大学教授
徐晓飞 哈尔滨工业大学教授
秦小麟 南京航空航天大学教授
钱培德 苏州大学教授
曹元大 北京理工大学教授
龚声蓉 苏州大学教授
谢希仁 中国人民解放军理工大学教授
译 者 序
数据库技术是计算机系每个学生的必修课,也是每位IT从业人员必备的技能。Oracle数据库以其优异的性能和强大的功能成为数据库市场上的主流产品,被广泛应用于各个领域。近年来,Oracle数据库被越来越多的国内外高等院校用于数据库教学,作为讲授数据库概念与数据库原理的主要载体。本书作为一本数据库编程初学者的入门教材,正好满足这种学习Oracle数据库编程相关知识的需求。本书内容涉及面广,包括了Oracle数据库编程所需的各方面的知识(涵盖了Oracle SQL、PL/SQL、Oracle JDBC、JavaScript、Java Servlet、XML等)。这有助于初学者从整体上对数据库编程有一个全面的认识。
书中的示例大都紧密围绕本书一开始提到的三个综合数据库开发项目,这使得书中的示例代码具有连贯的应用环境,具有实际的应用意义,并且更容易理解。
全书共分10章,各章内容简介如下。
第1章“关系数据模型”讲解关系数据库的一些基本原理和基本知识。
第2章“Oracle SQL基础”介绍Oracle SQL的语法。
第3章“PL/SQL基础”主要介绍数据类型、变量、程序控制语句、游标、异常处理、触发器、存储过程和函数等内容。
第4章“PL/SQL Web编程”介绍使用PL/SQL编写Web应用程序所需的概念和 技术。
第5章“Oracle JDBC基础”介绍JDBC API。结合实例,阐述如何连接Oracle数据库、发出SQL查询命令和显示处理结果。
第6章“JavaScript基础”介绍JavaScript的基本语法,以及用于编写动态的和高交互性的Web应用程序的事件驱动架构。
第7章“使用Java servlet进行Oracle Web编程”介绍网页编程。
第8章“Oracle XML基础”介绍XML语法基础、使用SAX和DOM分析API进行XML分析、Oracle的XML-SQL实用工具(XSU)和XMLType对象类型、XML命名空间和XML模式语言。
第9章“XML查询和转换”结合实例详细讨论了XPath、XQuery和XSLT,并特别强调了在Oracle 10g中的实现细节。
第10章“建议项目”提供一些综合数据库项目,供读者参考,以增强对本书内容的进一步理解。
本书的主要译者有王彬、刘宏志、戴艳萍,参加本书翻译工作的还有王寒、易宗丽、刘小艳、王帆、杜琼等人。
对于本书的出版,清华大学出版社的文开琪编辑给予了很大的帮助和指导,在此表示衷心的感谢!
希望本书能为Oracle数据库编程初学者的学习提供帮助。
由于译者水平有限,书中肯定存在不准确或疏漏之处,恳请读者在学习过程中批评 斧正。
译者
2007年12月于北京
前 言
Oracle是全世界使用最为广泛的数据库系统之一。它能运行在从Windows PC到UNIX服务器在内的几乎所有平台上。它具有一系列配套编程工具和开发环境,并提供各种高级编程语言访问数据库的接口。
近年来,在美国和其他国家,越来越多的高等院校采用Oracle数据库进行数据库教学,将其作为讲授数据库概念和数据库原理的主要载体。这就产生了对简明Oracle编程教材的需求,以弥补传统数据库教材的不足。满足这一需求是本书创作的主要动机。本书也适合非学术研究的IT从业人员学习Oracle编程。
本书当前版本新增了两个关于JavaScript和XML查询及转换的章节,同时删除了原有题为“SQLJ:嵌入式Java SQL”一章的内容。嵌入式SQLJ一章的内容将放在Internet上供有需要的读者下载。另外还新增了如何用Servlet API管理会话以及用XML模式语言做模式定义的相关内容。从Oracle 8i开始,各个版本都加强了对Internet数据库的支持。这一支持对于开发基于浏览器的三层架构Web应用程序的开发人员有着至关重要的作用。PL/SQL这一关键性过程语言,通过一套网络开发工具包得到增强,简化了动态网页开发。Sun公司的Java Servlet和JSP(Java Server Page)得到Oracle的大力支持。Oracle 10g对使用该项技术进行Web应用程序开发有着很好的支持。XML是目前用于数据交换应用程序的最新技术。Oracle 10g对XML也有良好的支持。这些支持表现在几个方面:内置XML分析器、XML数据类型数据列、XML查询语言的导入以及XSLT(XML转换语言)。本书新增的章节对以上新技术进行了详细的讲解。
本书涉及的技术有Oracle SQL、PL/SQL、使用PL/SQL进行Web应用程序开发、在Java中用JDBC进行数据库访问、JavaScript、使用Java Servlet和JSP进行Web应用程序开发以及Oracle对XML的支持。SQL和PL/SQL是Oracle数据库的两门核心语言,是学习使用Oracle数据库的基础。Java已经成为广泛使用的事实上的数据库编程语言。掌握JDBC对于编写Oracle数据库应用程序非常关键。随着Internet的飞速发展,越来越多基于Oracle数据库的网络应用出现在Internet上。PL/SQL Web工具箱、PL/SQL服务器页面技术、Java Servlet和JSP技术已成为编写Web应用的必备技能。另外,使用Javascript技术开发互动性强、动态用户界面的Web应用程序也变得很普遍。对于Web应用开发者来说,JavaScript编程技能也变得非常重要。XML标准对于当前的分布式网络环境有着巨大的影响。学习Oracle环境下的XML语言日渐成为IT从业人员的一项重要技能。
本书一开始介绍了三个综合数据库开发项目(分别为成绩表数据库、邮购订单数据库和股票交易数据库)。之后的许多章节都围绕这三个数据库进行实例讲解。
成绩表数据库存放任课老师跟踪录入的信息,具体如:学生信息;开设的课程;哪些学生注册了哪些课程;任课的评分项目;每个学生在各个评分项目中的得分情况。书中展示了一个示例程序,通过该程序,老师可以更新数据库,学生可以查询分数。
邮购订单数据库存放着与一家邮购公司相关的数据。该数据库的一个变形被用于网上商店,用户可通过该程序进行网上购物、搜索商品、添加商品、更新购物车和结账。
股票交易数据库保存有与公司有关的信息,包括其股票价格和在股票交易所开户的成员。书中实现的应用程序,允许成员登录系统、获取股票价格信息并买卖股票。
部分示例应用程序在书中所讨论的各种编程环境有着完整的代码实现。其余的应用程序在书中只能部分展示,完整的源程序可从出版社的网站下载。
本书的使用
以数据库关系模型为内容并使用Oracle作为课程项目和课后练习的数据库入门课程非常适合采用本书作为辅助教材。课程设计项目可以使用C/C++加嵌入式SQL或Java加JDBC进行开发。Web项目可以使用PL/SQL Web工具箱、PL/SQL服务器页面、Java Servlet、JSP和XML进行开发。书中有一整章的篇幅是关于课程设计项目开发的建议。这些项目开发通常是数据库入门课程的课外作业。可以让班里的学生组成一个个团队,每个团队以一个问题描述为开始,写好问题描述规格书,设计出数据库,用Oracle创建数据库,并编写一些应用程序来访问数据库。部分章节还配有复习题供读者巩固和加深对这些知识点的理解。
本书也适合那些对Oracle技术感兴趣的非学术研究型的读者。通过本书,读者能找到关于SQL、PL/SQL、PL/SQL Web 工具箱、PL/SQL服务器页面、Pro*C/C++,JDBC、JavaScript、Java Servlet、JSP和XML的丰富知识内容。本书可以看作是探索Oracle技术的起点。
补 充 资 料
本书的补充资料可在下列网址找到:
http://tinman.cs.gsu.edu/~raj/books/oracle10-primer.html
通过该网址进入补充资料中心,可以获取以下相关内容。
* 本书中未包括的Pro*C/C++和SQLJ 章节的内容。
* 书中的三个运行程序示例的完整源代码(成绩表、邮购订单和股票交易)。书中引用的大多只是代码的片段。
* 几个用于考试/家庭作业/小型测试项目的完整源代码。
* 章末复习题的答案。
* 另外还有其他一些数据库项目的完整源代码及章末复习题的答案可供课程的指导老师网上下载。详情请联系您的Addison-Wesley代表(或通过发送邮件coo@netease.com获得帮助)。
致 谢
首先,要感谢Addison-Wesley出版社的Matt Goldstein,多亏他的紧密配合和辛勤工作,本书才得以准时出版。与Addison-Wesley出版社的职员一起工作总是一件令人愉快的事。另外,我要感谢下列评审人员,他们为本书的各个版本提供了非常有价值的关键意见,使得本书在内容和表述方面得以改进。他们是:纽约州立大学技术学院的Louis Mazzucco,匹兹堡大学的Panos Chrysanthis,利哈伊大学的S. David Wu,纽约城市大学的Akira Kawaguchi,纽约州立大学考博斯基尔分校的Louise Mazzucco,马凯特大学的Mark Barnard,Willie Favero,Ashesh Parekh,圣路易斯欧比斯普加州理工学院的Laurian Chirica,新泽西理工学院的James Geller,伊利诺大学香槟分校的Chad Peiper,纽约州立大学布法罗分校的Bina Ramamurthy,中密歇根大学的Ahmet Ugur,乔治·梅森大学的Sean Wang。
还要感谢过去几年里在威奇塔州立大学和乔治亚州立大学Oracle课程开发项目中付出辛勤劳动的我的学生。特别感谢Krissy Echols,Veena Pujari和Radhika Venkataraman为设计和实现书中SQLJ一章讨论的股票交易数据库应用程序所做的工作。特别感谢Radhika Venkataraman为设计和实现Java Servlet一章讨论的网上购物程序所做的工作。
最后,要感谢我的家人在我写本书期间给予的支持。Radhu,谢谢你的辛勤工作和理解。Nannu和Nammi,谢谢你们在本书写作期间给予的合作和持之以恒的鼓励。
ii
Oracle 10g编程基础
iii
目 录
第1章 关系数据模型 1
1.1 关系数据库 2
1.2 完整性约束 2
1.2.1 主键 3
1.2.2 参照完整性约束——外键 3
1.2.3 非空约束 3
1.3 关系的表格视图 3
1.4 示例数据库 4
1.4.1 成绩表数据库 4
1.4.2 邮购订单数据库 6
1.4.3 股票交易数据库 8
1.5 关系代数 10
1.5.1 集合运算符 10
1.5.2 关系运算符 11
1.5.3 用关系代数进行查询 13
第2章 Oracle SQL基础 17
2.1 Oracle SQL*Plus 18
2.1.1 进入和退出SQL*Plus 18
2.1.2 在SQL*Plus下执行命令 18
2.1.3 缓冲区操作命令 21
2.1.4 格式化查询结果 22
2.1.5 SQL*Plus会话截取 24
2.2 创建、删除和修改表 24
2.2.1 删除表 26
2.2.2 创建表 26
2.2.3 修改表 30
2.3 插入行 30
2.4 查询数据库 32
2.4.1 简单select语句 32
2.4.2 子查询 34
2.4.3 并 38
2.4.4 forall查询 39
2.4.5 聚合函数 40
2.4.6 group by和having子句 41
2.4.7 完整的select语句 42
2.4.8 字符串、数值和日期函数 43
2.5 视图 51
2.5.1 创建视图 51
2.5.2 删除视图 52
2.6 修改数据库 52
2.6.1 insert语句 52
2.6.2 update语句 53
2.6.3 delete语句 54
2.6.4 commit和rollback语句 54
2.7 序列 55
2.8 Oracle数据字典 55
2.8.1 user_catalog表 55
2.8.2 user_objects表 56
2.8.3 user_tables表 56
2.8.4 user_tab_columns表 56
2.8.5 user_views表 56
2.9 Oracle 10g 对象特性 56
2.9.1 create type语句 57
2.9.2 可变数组集合类型 57
2.9.3 插入行 58
2.9.4 用户自定义方法 60
2.9.5 嵌套表 60
2.9.6 对象表 61
2.9.7 向嵌套表中插入行 61
2.9.8 查询和访问数据 62
练习 64
第3章 PL/SQL基础 67
3.1 什么是PL/SQL 68
3.2 数据类型和变量 68
3.3 程序控制语句 70
3.3.1 null语句 70
3.3.2 赋值语句 70
3.3.3 条件语句 70
3.3.4 循环 72
3.4 程序结构 74
3.4.1 匿名块 74
3.4.2 过程和函数 75
3.4.3 存储过程和函数 77
3.4.4 包 78
3.5 触发器 81
3.6 使用游标访问数据库 85
3.6.1 显式游标 85
3.6.2 参数化的游标 87
3.6.3 更新查询 88
3.6.4 游标变量 89
3.7 记录 91
3.7.1 基于表的记录 91
3.7.2 基于游标的记录 91
3.7.3 程序员定义的记录 92
3.8 PL/SQL表 93
3.9 内建包 95
3.9.1 dbms_output包 95
3.9.2 dbms_sql包 96
3.10 错误处理 104
3.11 在PL/SQL中访问Oracle 10g
对象 107
3.11.1 声明和初始化对象 107
3.11.2 对象类型方法实现 108
3.11.3 在PL/SQL中访问
数据库对象 108
3.11.4 在PL/SQL中访问
可变数组 110
3.11.5 集合对象的内建方法 111
练习 112
第4章 PL/SQL Web 编程 115
4.1 HTTP基础 116
4.1.1 资源和资源定位器符(URL) 117
4.1.2 HTTP消息的格式 117
4.2 一个简单的例子 119
4.3 打印HTML表 121
4.4 传递参数 122
4.5 处理HTML表单 124
4.6 多值参数 129
4.6.1 process_teacher_option
过程 130
4.6.2 select_course过程 131
4.6.3 process_teacher_sub_option
过程 132
4.6.4 add_scores过程 133
4.6.5 process_scores过程 135
4.6.6 insert_scores过程 137
4.7 PL/SQL Web 工具箱 138
4.7.1 表格打印实用程序 139
4.7.2 动态SQL 141
4.8 PL/SQL 服务器页面(PSP) 143
4.8.1 在PSP中传送参数 144
4.8.2 其他PSP语法 146
练习 148
第5章 Oracle JDBC基础 151
5.1 什么是JDBC 152
5.2 一个简单的JDBC程序 152
5.3 开发JDBC应用程序 153
5.3.1 加载JDBC驱动程序 153
5.3.2 连接数据库 154
5.3.3 Connection对象 154
5.4 非查询SQL语句 156
5.4.1 使用Statement对象 156
5.4.2 使用PreparedStatement
对象 158
5.4.3 使用CallableStatement
对象 160
5.5 执行SQL查询 163
5.5.1 ResultSet类 163
5.5.2 ResultSet的方法 163
5.5.3 一个SQL查询例子 164
5.5.4 ResultSetMetadata 167
5.5.5 Oralce REF CURSOR类型 171
5.5.6 处理多个ResultSet 173
5.6 成绩表应用程序 175
5.6.1 select_course函数 176
5.6.2 add_enrolls函数 177
5.6.3 add_scores函数 177
5.6.4 modify_score函数 178
5.7 数据库元数据 179
5.8 错误和警告 181
5.8.1 SQLException类 181
5.8.2 DataTruncation类 182
5.9 可以滚动的ResultSet 182
练习 186
第6章 JavaScript基础 189
6.1 JavaScript语法和基本概念 190
6.1.1 基本类型 190
6.1.2 变量 190
6.1.3 操作符和类型转换 190
6.1.4 语句和简单输入/输出 191
6.1.5 数组 193
6.1.6 函数 194
6.1.7 模式匹配 195
6.1.8 JavaScript错误控制台
和调试 196
6.2 Web浏览器编程环境 196
6.3 事件处理模型和HTML表单 199
6.3.1 Focus和Blur事件 199
6.3.2 Load和Unload事件 199
6.3.3 Click事件 199
6.3.4 Change事件 199
6.3.5 Submit事件 199
6.4 一个简单例子 200
6.5 表单数据验证 201
6.6 在运行时创建HTML表单元素 204
6.7 条件表单元素 208
练习 212
第7章 使用Java servlet进行
Oracle Web编程 213
7.1 一个简单的servlet 214
7.2 HTTP servlet API基础知识 215
7.2.1 HttpServlet类 215
7.2.2 HttpServletRequest类 216
7.2.3 HttpServletResponse类 217
7.3 网上购物应用程序 217
7.4 在servlet中处理HTML表单 219
7.5 SearchParts和AddToCart 222
7.6 Oracle的动态HTML生成包 228
7.6.1 一个简单的例子 228
7.6.2 HTML表单处理 230
7.6.3 格式化HTML表格 233
7.7 使用HttpSession对象进行
会话跟踪 235
7.7.1 状态管理相关的HttpSession
方法 235
7.7.2 与会话生命期相关的
HttpSession方法 236
7.7.3 一个例子 236
7.8 Java服务器页面 240
练习 248
第8章 Oracle XML基础 251
8.1 基本语法 252
8.1.1 XML元素 252
8.1.2 XML属性 253
8.1.3 混合使用元素和文本数据 254
8.1.4 其他构造 254
8.2 文档类型定义 254
8.3 用Java进行XML分析 256
8.3.1 SAX分析 256
8.3.2 DOM分析 262
8.4 Oracle XML-SQL 实用程序 268
8.4.1 规范的SQL到XML映射 268
8.4.2 规范的XML到SQL映射 269
8.4.3 XSU Java API 271
8.5 XMLType 277
8.5.1 表中的XMLType列 277
8.5.2 查询XML数据 279
8.5.3 更新和删除XML数据 282
8.6 命名空间 282
8.7 XML模式 283
8.7.1 简单类型 283
8.7.2 复杂类型 287
8.7.3 根据模式验证XML文档 290
练习 290
第9章 XML查询和转换 297
9.1 XPath 298
9.1.1 基本XPath表达式 299
9.1.2 高级导航 300
9.2 XQuery 303
9.2.1 使用DBMS_XDB PL/SQL
包创建XML DB资源 303
9.2.2 在SQL*Plus中
执行XQuery查询 304
9.2.3 简单XQuery表达式 305
9.2.4 FLWOR表达式 308
9.3 XSLT 314
9.3.1 一个简单的XSLT程序
及其调用 314
9.3.2 XSLT指令<xsl:value-of> 315
9.3.3 XSLT指令<xsl:for-each> 316
9.3.4 XSLT指令<xsl:sort> 317
9.3.5 XSLT指令<xsl:if>
和<xsl:choose> 318
9.3.6 XSLT指令
<xsl:apply-templates> 319
9.3.7 内置模板规则 320
9.3.8 创建元素和属性 320
9.3.9 XSL变量和参数 321
练习 325
第10章 建议项目 329
10.1 飞机航班信息系统 330
10.2 图书馆数据库应用程序 331
10.3 大学学生数据库 332
10.4 录像带连锁店数据库 333
10.5 银行数据库 334
10.6 BibTEX数据库 335
10.7 音乐店数据库 336
10.8 网上拍卖数据库 337
10.9 Oracle数据字典浏览器 338
10.10 基于WEB的Oracle数据
字典浏览器 338
10.11 基于Web的QBE界面 340
10.12 网上调查管理系统 341
10.13 网上考试管理系统 344
10.14 在线公告牌 347
10.15 数据输入表单 348
建议阅读 352
xii
Oracle 10g编程基础
xi