第1部分 第1周课程 1
第1章 第1天课程:学习PL/SQL基础知识 3
1.1 PL/SQL是什么 3
1.2 为什么要学习PL/SQL 4
1.3 SQL、SQL*Plus、PL/SQL之间的差别 4
1.3.1 SQL 5
1.3.2 PL/SQL 5
1.3.3 SQL*Plus 5
1.3.4 阅读本书需要的资源 6
1.4 开始使用PL/SQL 8
1.4.1 PL/SQL是块结构化的 8
1.4.2 编译和执行简单的块 9
1.4.3 生成输出结果 10
1.4.4 避免重新输入 11
1.4.5 编写第一个函数 12
1.4.6 查找编译错误 13
1.4.7 显示函数的返回值 14
1.5.1 启动过程生成器 15
1.4.8 这个简单的函数有用吗 15
1.5 使用Developer/2000中的过程生成器执行PL/SQL 15
1.5.2 使用交互式PL/SQL 16
1.5.3 创建SS_THRESH函数 17
1.5.4 与数据库相连 18
1.6 使用SQLPlus Wroksheet 18
1.6.1 使用SQLPlus Wroksheet执行PL/SQL块 19
1.7 总结 19
1.8 问与答 20
1.9 测验和练习 20
1.9.1 测验 20
1.9.2 练习 21
第2章 第2天课程:编写声明和块 23
2.1 探讨数据类型 23
2.1.1 VARCHAR2 25
2.1.2 VARCHAR2的子类型 25
2.1.3 CHAR 25
2.1.5 NUMBER 27
2.1.4 CHAR子类型 27
2.1.6 BINARY_INTEGER 29
2.1.7 PLS_INTEGER 32
2.1.8 DATE 32
2.1.9 BOOLEN 33
2.1.10 LONG 33
2.1.11 RAW 34
2.1.12 LONG RAW 34
2.1.15 MSLABEL 35
2.2 使用块结构 35
2.1.13 ROWID 35
2.1.14 UROWID 35
2.2.1 匿名块 36
2.2.2 函数和过程块 37
2.2.3 触发器块 39
2.2.4 嵌套块 40
2.2.5 嵌套函数和过程 42
2.2.6 作用域规则 45
2.3 总结 46
2.4 问与答 47
2.5 测验和练习 47
2.5.1 测验 47
2.5.2 练习 47
第3章 第3天课程:编写PL/SQL表达式 49
3.1 理解操作符、表达式和转换 49
3.2 使用PL/SQL操作符建立表达式 50
3.2.1 算术操作符 50
3.2.2 比较操作符 53
3.2.3 逻辑操作符 59
3.2.4 字符串操作符 61
3.3 对字符串使用比较操作符 62
3.3.1 字符集对字符串比较的影响 62
3.3.2 大小写对字符串比较的影响 64
3.4 对日期使用比较操作符 65
3.5 使用表达式 66
3.5.1 定义表达式 66
3.5.2 操作符优先级 67
3.5.4 表达式中的空值 68
3.5.3 表达式类型 68
3.6.1 隐式转换 73
3.6 转换数据类型 73
3.6.2 显式转换 75
3.7 总结 76
3.8 问与答 77
3.9 测验和练习 78
3.9.1 测验 78
3.9.2 练习 78
4.1 使用PL/SQL函数 79
第4章 第4天课程:使用函数、IF语句和循环 79
4.1.1 定义参数:形参和实参 81
4.1.2 返回类型 83
4.1.3 函数违规 84
4.1.4 异常处理 84
4.1.5 创建存储函数 84
4.1.6 查找错误 86
4.2.2 如何从PL/SQL中使用或不使用参数调用函数 87
4.2 NULL语句 87
4.2.1 为何使用NULL语句 87
4.2.3 调用者和定义者的权限 88
4.3 使用PL/SQL语句 89
4.3.1 IF语句 89
4.3.2 IF…THEN…ELSE语句 90
4.3.3 嵌套IF语句 91
4.3.4 使用IF…ELSIF语句 93
4.3.5 嵌套IF语句和ELSIF语句 95
4.3.6 格式化IF语句 95
4.3.7 避免IF语句中的常见错误 96
4.3.8 循环语句 96
4.3.9 反向循环 97
4.3.10 修改步长 98
4.4 总结 99
4.5 问与答 99
4.6.1 测验 100
4.6.2 练习 100
4.6 测验和练习 100
第5章 第5天课程:实现循环和GOTO语句 101
5.1 探讨标号和GOTO语句 101
5.1.1 语句标号 101
5.1.2 GOTO语句 102
5.1.3 GOTO语句的作用域规则 102
5.1.4 使用GOTO语句的范例 105
5.2 WHILE循环 106
5.2.1 WHILE循环范例 106
5.1.5 为何使用GOTO语句 106
5.3 EXIT语句和EXIT WHEN语句 110
5.3.1 使用EXIT和EXIT WHEN语句的范例 110
5.3.2 在循环中使用标号和EXIT语句 113
5.4 简单循环 114
5.4.1 简单循环范例 115
5.4.2 创建一个REPEAT…UNTIL循环 115
5.4.3 模仿的REPEAT…UNTIL循环范例 116
5.5 应该使用哪种循环 116
5.6.1 循环的格式 117
5.6 使用循环的指导原则 117
5.7 递归 119
5.7.1 准则 119
5.7.2 练习使用递归 119
5.7.3 为何使用递归 121
5.8 总结 122
5.9 问与答 122
5.10 测验和练习 122
5.10.2 练习 123
5.10.1 测验 123
第6章 第6天课程:使用Oracle的内置函数 125
6.1 SQL函数和PL/SQL函数的比较 125
6.2 主要的函数类型 126
6.3 试验函数 129
6.4 使用转换函数 130
6.4.1 使用TO_DATE函数 130
6.4.2 使用TO_CHAR 134
6.4.3 使用TO_NUMBER 136
6.4.4 使用TO_CHAR函数 140
6.5.1 SYSDATE函数 141
6.5 日期函数 141
6.5.2 TRUNC函数 142
6.5.3 ADD_MONTHS函数 144
6.5.4 NEXT_DAY函数 144
6.5.5 LAST_DAY函数 146
6.5.6 MONTHS_BETWEEN0函数 147
6.5.7 NEW_TIME函数 147
6.5.9 TRIM函数 149
6.5.8 ROUND函数 149
6.6 总结 150
6.7 问与答 150
6.8 测验和练习 151
6.8.1 测验 151
6.8.2 练习 151
第7章 第7天课程:过程、包、错误和异常 153
7.1 使用过程 153
7.1.3 创建过程 154
7.1.1 为何使用过程 154
7.1.2 过程和函数 154
7.1.4 RETURN语句 155
7.1.5 过程依赖性 155
7.1.6 重新编译存储过程 156
7.1.7 重新创建和修改函数 156
7.1.8 调用存储过程 157
7.1.9 使用参数 158
7.1.10 参数定义 158
7.1.11 列出存储过程的信息 158
7.1.12 删除存储过程 159
7.1.13 重载过程 159
7.1.14 使用递归过程 160
7.2 过程调用的安全性 161
7.3 探讨包 161
7.3.1 为何使用包 162
7.3.2 包规范 162
7.3.3 包体 163
7.3.4 创建包 164
7.3.5 调用包子程序 165
7.3.6 重新编译包 166
7.3.7 公有和私有包对象 166
7.3.8 包调用的安全性 166
7.3.9 变量、游标和常量的持续性 167
7.3.10 包状态 167
7.3.11 包的依赖性 167
7.4 捕获错误和异常 167
7.4.1 异常处理结构 168
7.4.2 SQLCODE和SQLERRM函数 171
7.4.3 发生异常后继续处理 173
7.4.4 发生异常后重试 174
7.4.5 重新引发异常 175
7.5 总结 176
7.6 问与答 176
7.4.7 传播异常 176
7.4.6 异常的作用域规则 176
7.7 测验和练习 177
7.7.1 测验 177
7.7.2 练习 177
第1周 课程复习 178
第2部分 第2周课程 179
第8章 第8天课程:使用SQL 181
8.2 创建一些Oracle表 182
8.1 SQL DML语句的类型 182
8.3 使用INSERT语句 184
8.3.1 插入一些数据 185
8.4 单个的SELECT语句 187
8.4.1 SELECT语句范例 187
8.5 使用UPDATE语句和DELETE语句 188
8.6 异常处理类型 189
8.7 使用LOCK TABLE语句 190
8.8 事务控制语句 191
8.9 使用记录 191
8.9.1 声明记录变量 191
8.9.3 使用基于数据库表的记录变量 192
8.9.2 使用%TYPE属性 192
8.9.4 使用记录变量和SELECT语句 193
8.9.5 使用基于游标定义的记录变量 195
8.9.6 包层次的声明 196
8.10 伪列 197
8.10.1 CURRVAL伪列和NEXTVAL伪列 197
8.10.2 ROWID伪列 197
8.12 问与答 198
8.11 总结 198
8.10.3 ROWNUM伪列 198
8.13 测验和练习 199
8.13.1 测验 199
8.13.2 练习 199
第9章 第9天课程:使用游标操纵数据 201
9.1 什么是游标 201
9.2 显式游标 202
9.2.1 声明游标 202
9.2.2 声明游标参数 203
9.2.3 打开游标 204
9.2.4 将数据取回到游标中 205
9.2.5 关闭游标 206
9.2.6 显式游标的属性 206
9.3 显式游标范例 208
9.3.1 使显式游标自动化 209
9.4 隐式游标 210
9.4.1 隐式游标的属性 210
9.5 游标参数的作用域 212
9.6 游标RETURN子句和包 212
9.7.1 声明游标变量 213
9.7 游标变量 213
9.7.2 通过游标变量使用游标 214
9.7.3 将游标变量赋给其他变量 215
9.7.4 将游标变量作为参数 215
9.8 游标的当前记录 217
9.9 游标的作用域 217
9.10 游标别名 218
9.13.1 测验 219
9.13 测验和练习 219
9.12 问与答 219
9.11 总结 219
9.13.2 练习 220
第10章 第10天课程:集合 221
10.1 使用PL/SQL索引表 221
10.1.1 声明索引表 222
10.1.2 将条目插入到索引表中 222
10.1.3 引用索引表中的值 224
10.1.5 删除表中的条目 225
10.1.4 修改表中的条目 225
10.1.6 PL/SQL表的方法 227
10.2 使用嵌套表 229
10.2.1 声明嵌套表 229
10.2.2 给嵌套表添加条目 230
10.2.3 删除嵌套表中的条目 233
10.3 使用变长数组 236
10.3.1 声明和初始化变长数组 236
10.3.2 给变长数组添加和删除数据 237
10.4.1 使用BULK COLLECT 239
10.4 使用批绑定 239
10.4.2 使用FORALL 241
10.5 集合的异常处理 242
10.6 总结 243
10.7 问与答 243
10.8 测验和练习 244
10.8.1 测验 244
10.8.2 练习 244
11.1 什么是触发器 245
第11章 第11天课程:编写数据库触发器 245
11.2 DML触发器 246
11.2.1 DML触发器范例 246
11.2.2 DML触发器分类 247
11.2.3 定义数据库触发器的语法 249
11.3 触发器的用途 250
11.3.1 维护数据完整性 250
11.3.2 维护历史记录 254
11.4.1 列出触发器 257
11.4 管理触发器 257
11.4.2 查看触发器的代码 258
11.4.3 打开和关闭触发器 260
11.5 非传统触发器 261
11.5.1 定义作用于数据库事件或模式事件的触发器的语法 261
11.5.2 事件属性 262
11.5.3 编写一个数据库事件触发器 263
11.5.4 编写DDL事件触发器 265
11.6 使用替代触发器 266
11.6.2 编写一个替代触发器 267
11.6.1 定义替代触发器的语法 267
11.7 探讨触发器的局限性 269
11.7.1 触发器和变化表 269
11.8 总结 278
11.9 问与答 278
11.10 测验和练习 279
11.10.1 测验 279
11.10.2 练习 279
12.1 面向对象编程的基本知识 281
第12章 第12天课程:将Oracle8i对象用于面向对象编程 281
12.1.1 封装 282
12.1.2 继承 282
12.1.3 多态 282
12.1.4 类、对象、属性和方法 283
12.1.5 OOP优于传统方法的地方 283
12.2 Oracle8i是如何实现对象的 283
12.3 定义对象类型 284
12.2.3 对象视图 284
12.2.2 对象表 284
12.2.1 对象类型 284
12.3.1 构造函数 288
12.3.2 取值方法 288
12.3.3 赋值方法 289
12.4 实例化和使用对象 289
12.5 存储和检索对象 292
12.5.1 将对象存储为表字段 292
12.5.2 检索和更新表字段中的对象 293
12.6 使用对象表 295
12.6.1 将对象存储在对象表中 297
12.6.2 检索和更新对象表中的对象 298
12.6.3 删除对象表中的对象 300
12.7 嵌套和共享对象 301
12.7.1 点号表示法 301
12.7.2 对象引用 302
12.8 探讨SELF参数 305
12.9 重载 306
12.10 比较对象 307
12.10.1 ORDER方法 308
12.10.2 MAP方法 309
12.11 Oracle实现的局限性 310
12.12 总结 310
12.13 问与答 310
12.14 测验和练习 311
12.14.1 测验 311
12.14.2 练习 311
13.1.1 识别语法错误 313
第13章 第13天课程:调试代码并防止错误 313
13.1 定位并消除语法错误 313
13.1.2 一个识别语法错误的范例 315
13.1.3 防止语法错误 319
13.2 处理逻辑错误 320
13.2.1 操作次序 320
13.2.2 死循环 321
13.2.3 逻辑错误的排除方法 321
13.3.1 将DBMS_OUTPUT用做调试工具 324
13.3 使用工具帮助调试程序 324
13.3.2 编写DEBUG包 325
13.4 防止错误并规划以后的调试 330
13.4.1 定义需求和规划项目 330
13.4.2 使用模块化方法编码 331
13.4.3 注释代码 331
13.4.4 在代码中编写断言 333
13.4.5 格式化代码 335
13.6 问与答 337
13.5 总结 337
13.7.1 测验 338
13.7.2 练习 338
13.7 测验和练习 338
第14章 第14天课程:使用大型对象类型 339
14.1 探讨大型对象数据类型 339
14.1.1 LOB的局限性 340
14.1.2 LOB和LONG数据类型的比较 340
14.1.3 将LONG转换为LOB 341
14.2 在Oracle8i数据库中使用外部文件 341
14.2.1 创建目录对象 341
14.2.2 BFILE的局限性 342
14.3 将DBMS_LOB包用于BFILE 342
14.3.1 BFILENAME函数 343
14.3.2 COMPARE函数 343
14.3.5 FILEEXISTS函数 344
14.3.6 FILEGETNAME过程 344
14.3.3 FILECOLOSE过程 344
14.3.4 FILECLOSEALL过程 344
14.3.7 FILEISOPEN函数 345
14.3.8 FILEOPEN过程 345
14.3.9 GETLENGTH函数 345
14.3.10 INSTR函数 346
14.3.11 READ过程 346
14.4 使用DMBS_LOB包的BFILE范例 347
14.4.1 访问BFILE 347
14.3.12 SUBSTR函数 347
14.4.2 比较文件 349
14.5 使用定位器 351
14.6 将DBMS_LOB包用于内部LOB 352
14.6.1 APPEND过程 352
14.6.2 COMPARE函数 353
14.6.3 COPY过程 353
14.6.4 EMPTY_BLOB函数 354
14.6.5 EMPTY_CLOB函数 354
14.6.8 INSTR函数 355
14.6.7 GETLENGTH函数 355
14.6.6 ERASE过程 355
14.6.9 READ过程 356
14.6.10 SUBSTR函数 357
14.6.11 TRIM过程 357
14.6.12 WRITE过程 358
14.7 使用DMBS_LOB包的内部LOB范例 358
14.7.1 创建一个表 358
14.7.2 给表添加数据 359
14.7.3 使用COPY过程将数据添加到表LOBS中 360
14.7.4 使用APPEND和WRITE操纵内部LOB 361
14.7.5 分析内部LOB的内容 363
14.7.6 使用TRIM和ERASE编辑CLOB 364
14.8 临时LOB 366
14.8.1 管理临时LOB 366
14.8.2 创建临时LOB 366
14.10 问与答 367
14.11 测验和练习 367
14.9 总结 367
14.11.1 测验 368
14.11.2 练习 368
第2周课程复习 369
第3部分 第3周课程 371
第15章 第15天课程:管理事务和锁定 373
15.1 事务类型 373
15.2 开始事务 374
15.3 结束事务 375
15.4 撤销事务 376
15.5 两步提交 376
15.6 使用保存点创建书签 377
15.7 使用RELEASE选项 377
15.8 使用锁定 378
15.8.1 锁定表 378
15.8.2 锁定记录 379
15.8.3 显式锁定 379
15.8.4 DBMS_LOCK包 379
15.8.6 监视锁定 382
15.8.5 使用其他锁定 382
15.9 总结 383
15.10 问与答 383
15.11 测验和练习 383
15.11.1 测验 383
15.11.2 练习 383
第16章 第16天课程:生成动态SQL 385
16.1 什么是动态SQL,为何使用它 385
16.2 两种使用动态SQL的方法 386
16.3 使用DBMS_SQL包 387
16.3.1 使用DBMS_SQL包执行非查询DDL和DML语句 387
16.3.2 使用DBMS_SQL包执行查询 393
16.3.3 使用DBMS_SQL包执行匿名PL/SQL块 401
16.3.4 处理DBMS_SQL错误 404
16.3.5 使用LAST_ROW_COUNT 404
16.3.6 使用LAST_ROW_ID 405
16.4.1 执行DML和DDL 407
16.4 使用本机动态SQL 407
16.3.7 使用LAST_ERROR_POSITON 407
16.4.2 执行SQL查询 410
16.4.3 执行PL/SQL块 412
16.5 总结 413
16.6 问与答 413
16.7 测验和练习 414
16.7.1 测验 414
16.7.2 练习 414
17.1 DBMS_OUTPUT包 415
第17章 第17天课程:将数据写到文件和显示屏 415
17.1.1 开启DBMS_OUTPUT包 416
17.1.2 关闭DBMS_OUTPUT包 416
17.1.3 将数据写到缓冲区 417
17.1.4 从缓冲区读取数据 418
17.1.5 DBMS_OUTPUT包引发的异常 422
17.2 使用UTL_FILE包读写文件 423
17.2.1 文件输入 423
17.2.2 使用UTL_FILE过程和函数 424
17.2.4 使用UTL_FILE的范例 429
17.2.3 FFLUSH过程 429
17.3 将TEXT_IO用于客户文件 432
17.4 总结 434
17.5 问与答 434
17.6 测验和练习 435
17.6.1 测验 435
17.6.2 练习 435
18.1 使用DBMS_JOB包提交作业 437
第18章 第18天课程:管理数据库作业 437
18.2 使用后台进程 438
18.3 执行作业 439
18.3.1 使用SUBMIT将作业提交给作业队列 439
18.3.2 使用RUN立刻执行作业 441
18.3.3 探讨作业环境 441
18.4 查看作业 443
18.4.1 查看作业的范例 444
18.5 作业管理 445
18.5.1 删除作业 446
18.5.2 修改作业 446
18.5.3 导入和导出作业 447
18.5.4 处理损坏的作业 447
18.6 练习管理作业 448
18.6.1 创建作为作业提交的过程 448
18.6.2 将所有的作业提交给作业队列 450
18.6.3 立刻运行所有的三个作业 450
18.6.4 查看关于作业的信息 451
18.6.5 通过运行HELLO作业修改作业 452
18.6.6 删除Hello作业 453
18.7 总结 454
18.8 问与答 454
18.9 测验和练习 455
18.9.1 测验 455
18.9.2 练习 455
第19章 第19天课程:报警以及与其他过程通信:DBMS_ALERT和DBMS_PIPE包 457
19.1 DBMS_ALERT包 457
19.3 注册报警 458
19.2 使用SIGNAL发布报警 458
19.4 等待特定的报警 459
19.5 等待所有已注册的报警 459
19.6 删除一个报警 460
19.7 删除所有的报警 460
19.8 SET_DEFAULTS过程涉及的轮讯和事件 460
19.9 演示DBMS_ALERT包的用法 460
19.9.1 创建备份数据库 461
19.9.2 创建触发器,以发送报警 462
19.9.3 等待报警 463
19.10 DBMS_PIPE包 466
19.10.1 公有管道和私有管道 467
19.10.2 使用管道 467
19.10.3 DMBS_PIPE中的函数和过程 468
19.10.4 使用管道的范例 472
19.10.5 其他管道函数和过程 475
19.10.6 管道的其他用途 476
19.11 报警和管道的比较 476
19.13 问与答 477
19.12 总结 477
19.14.1 测验 478
19.14.2 练习 478
19.14 测验和练习 478
第20章 第20天课程:PL/SQL和Java 479
20.1 使用Oracle的Java引擎 479
20.2 PL/SQL将被淘汰吗 480
20.3 创建Java过程 481
20.3.1 需要的前提条件 481
20.3.3 装载类 482
20.3.2 SS_CONSTANTS类 482
20.3.4 公布SSThresh方法 484
20.3.5 在SQL*Plus中调用SS_THRESH 485
20.3.6 在PL/SQL中调用SS_THRESH 485
20.3.7 删除SSContants类 486
20.4 从PL/SQL中调用Java 487
20.4.1 Employee类 487
20.4.2 公布Java方法 489
20.4.3 数据类型兼容性 491
20.4.4 使用OUT和IN OUT参数 493
20.5 使用SQLJ从Java中调用PL/SQL 495
20.5.1 使用SQLJ执行匿名PL/SQL块 495
20.5.2 使用SQLJ调用PL/SQL过程或函数 497
20.6 总结 500
20.7 问与答 500
20.8 测验和练习 500
20.8.2 练习 501
20.8.1 测验 501
第21章 第21天课程:高级排队 503
21.1 什么是AQ 503
21.1.1 揭开AQ的神秘面纱 504
21.1.2 AQ的重要特性 505
21.2 配置服务器,以便使用AQ 505
21.3 探讨AQ方案 506
21.4 创建一个消息队列 507
21.4.1 为负载定义一个类型 507
21.4.2 创建队列表 508
21.4.3 创建队列 510
21.5 启动和关闭队列 512
21.6 将消息放入队列 513
21.6.1 与入队相关的记录类型 513
21.6.2 将消息放入队列 516
21.7 从队列中检索消息 518
21.7.1 与出队相关的记录类型 518
21.7.2 将消息从队列中取出 519
21.8.1 删除队列 521
21.8 使用其他AQ过程 521
21.8.2 删除队列表 522
21.8.3 授予和收回访问队列的权限 522
21.9 总结 523
21.10 问与答 524
21.11 测验和练习 524
21.11.1 测验 524
21.11.2 练习 524
第3周课程复习 525
附录A 测验和练习答案 527