前言 1
第1章 PL/SQL简介 1
1.1 为什么使用PL/SQL 1
贺辞 1
1.1.1 客户-服务器模式 2
1.1.2 标准 3
1.2 PL/SQL的功能特性 3
1.2.1 块结构 3
1.2.2 变量和类型 5
1.2.3 循环结构 6
1.3 本书使用的约定 7
1.3.1 PL/SQL和Oracle版本 7
1.3.3 在线代码 8
1.3.2 Oracle文档 8
1.4 示例样表 9
1.5 小结 15
第2章 PL/SQL基础 16
2.1 PL/SQL块 16
2.2 词法单位 20
2.2.1 标识符 21
2.2.2 分界符 23
2.2.3 文字 24
2.2.4 注释 25
2.3 变量声明 26
2.3.1 声明语法 27
2.4 PL/SQL类型 28
2.3.2 变量初始化 28
2.4.1 标量类型(Scalar Type) 29
2.4.2 复合类型 33
2.4.3 引用类型 33
2.4.4 LOB类型 34
2.4.5 使用%TYPE 34
2.4.6 用户定义子类型 35
2.4.7 在数据类型之间进行转换 35
2.4.8 变量作用域和可见性 37
2.5 表达式和运算符 39
2.5.1 赋值 39
2.5.2 表达式 39
2.6.1 IF-TIIEN-ELSE 42
2.6 PL/SQL控制结构 42
2.6.2 循环 45
2.6.3 GOTO和标号 49
2.6.4 pragma 51
2.7 PL/SQL风格指南 52
2.7.1 注释风格 52
2.7.2 变量名风格 53
2.7.3 大写风格 53
2.7.4 缩进风格 54
2.7.5 常见风格 54
2.8 小结 54
第3章 记录和表 55
3.1 PL/SQL记录 55
3.1.1 记录赋值 56
21.3.2 由DBMS LOB例程引发的异常情态 57
3.1.2 使用%ROWTYPE 57
3.2 表 58
3.2.1 表和数组 59
3.2.2 表属性 61
3.2.3 使用PL/SQL表的指南 64
3.3 小结 64
第4章 在PL/SQL中使用SQL 65
4.1 SQL语句 65
4.2 在PL/SQL中使用DML 67
4.2.1 SELECT 68
4.2.2 INSERT 70
4.2.4 DELETE 71
4.2.3 UPDATE 71
4.2.5 WHERE子句 72
4.2.6 表引用 75
4.2.7 数据库链接 75
4.2.8 替代名(Synonym) 76
4.3 伪列 76
4.3.3 ROWID 77
4.3.1 CURRVAL和NEXTVAL 77
4.3.2 LEVEL 77
4.3.4 ROWNUM 78
4.4 GRANT、REVOKE和权限 78
4.4.1 对象和系统权限 78
4.4.2 GRANT 和REVOKE 79
4.4.3 角色 80
4.5 事务控制 81
4.5.1 COMMIT和ROLLBACK 82
4.5.2 保存点 83
4.5.3 事务和块 84
4.6 小结 84
第5章 内置SQL函数 85
5.1 前言 85
5.2 字符函数——返回字符值 85
5.2.3 INITCAP 86
5.2.2 CONCAT 86
5.2.1 CHR 86
5.2.4 LOWER 87
5.2.5 LPAD 87
5.2.6 LTRIM 88
5.2.7 NLS_INITCAP 89
5.2.8 NLS_LOWER 89
5.2.9 NLS_UPPER 90
5.2.10 REPLACE 90
5.2.11 RPAD 91
5.2.12 RTRIM 91
5.2.13 SOUNDEX 92
5.2.14 SUBSTR 93
5.2.15 SUBSTRB 93
5.2.16 TRANSLATE 94
5.2.17 UPPER 94
5.3.2 INSTR 95
5.3.1 ASCII 95
5.3 字符函数——返回数字值 95
5.3.3 INSTRB 96
5.3.4 LENGTH 97
5.3.5 LENGTHB 97
5.3.6 NLSSORT 97
5.4 数字函数 98
5.4.1 ABS 98
5.4.2 ACOS 98
5.4.5 ATAN2 99
5.4.3 ASIN 99
5.4.4 ATAN 99
5.4.6 CEIL 100
5.4.7 COS 100
5.4.8 COSH 101
5.4.9 EXP 101
5.4.10 FLOOR 101
5.4.13 MOD 102
5.4.11 LN 102
5.4.12 LOG 102
5.4.16 SIGN 103
5.4.14 POWER 103
5.4.15 ROUND 103
5.4.18 SINH 104
5.4.17 SIN 104
5.4.19 SQRT 105
5.4.20 TAN 105
5.4.21 TANH 105
5.4.22 TRUNC 106
5.5 日期函数 106
5.5.1 ADD_MONTHS 106
5.5.2 LAST_DAY 107
5.5.3 MONTHS_BETWEEN 107
5.5.4 NEW_TIME 107
5.5.5 NEXT_DAY 108
5.5.6 ROUND 109
5.5.7 SYSDATE 109
5.5.8 TRUNC 110
5.5.9 日期算术 111
5.6 转换函数 111
5.6.1 CHARTOROWID 111
5.6.2 CONVERT 112
5.6.5 ROWIDTOCHAR 113
5.6.3 HEXTORAW 113
5.6.4 RAWIOHEX 113
5.6.6 TO_CHAR(dates) 114
5.6.8 TO_CHAR(mumbers) 116
5.6.7 TO_CHAR(labels) 116
5.6.9 TO_DATE 118
5.6.10 TO_LABEL 118
5.6.11 TO_MULTI_BYTE 118
5.6.12 TO_NUMBER 119
5.6.13 TO_SINGLE_BYTE 119
5.7 分组函数 119
5.7.1 AVG 120
5.7.2 COUNT 120
5.7.3 GLB 121
5.7.4 LUB 121
5.7.5 MAX 121
5.7.8 SUM 122
5.7.6 MIN 122
5.7.7 STDDEV 122
5.8.1 BFILENAME 123
5.7.9 VARIANCE 123
5.8 其他函数 123
5.8.2 DECODE 124
5.8.3 DUMP 124
5.8.4 EMPTY CLOB/EMPTY_BLOB 126
5.8.5 GREATEST 126
5.8.6 GREATEST_LB 127
5.8.8 LEAST_UB 127
5.8.9 NVL 127
5.8.7 LEAST 127
5.8.10 UID 128
5.8.11 USER 128
5.8.12 USERENV 129
5.8.13 VSIZE 130
5.9 使用PL/SQL:将数字作为文本单字进行打印 130
5.10 小结 138
6.1 什么是游标? 139
第6章 游标 139
6.1.1 处理显式游标 140
6.1.2 处理隐式游标 146
6.2 游标提取循环 148
6.2.1 简单循环 148
6.2.2 WHILE循环 150
6.2.3 游标式FOR循环 151
6.2.4 NO_DATA_FOUND和%NOTFOUND 152
6.2.5 SELECT FOR UPDATE游标 152
6.3 游标变量 156
6.3.1 声明游标变量 157
6.3.2 为游标变量分配存储空间 158
6.3.5 游标变量示例1 159
6.3.3 打开查询的游标变量 159
6.3.4 关闭游标变量 159
6.3.6 游标变量示例2 162
6.3.7 使用游标变量的限制 163
6.4 小结 164
第7章 子程序:过程和函数 165
7.1 创建过程和函数 165
7.1.1 创建过程 166
7.1.2 创建函数 175
7.1.3 在子程序中进行异常处理 178
7.1.4 删除过程和函数 180
7.2 子程序位置 180
72.1 内置子程序(StoredSubprogram) 180
7.2.2 本地子程序 182
7.3 子程序依赖性 185
7.4 权限和内置子程序 188
7.4.1 EXECUTE权限 189
7.4.2 内置子程序和角色 190
7.5 小结 192
第8章 包 193
8.1 包 193
8.1.1 包规范(Package Specification) 193
8.1.2 包主体(Package Body) 194
8.1.3 包和作用域 196
8.1.4 重载包装子程序 197
8.1.5 包初始化 199
8.1.6 包和相关性 201
8.2 在SQL语句中使用内置函数 203
8.2.1 纯度级别 204
8.2.2 RESTRICT_REFERENCES 206
8.2.3 缺省参数 208
8.3 使用PL/SQL:PL/SQL数据模式输出程序 208
8.4 小结 217
第9章 触发器 218
9.1 创建触发器 218
9.1.1 触发器组件 219
9.1.2 触发器和数据字典 222
9.1.3 触发器点火次序 223
91.4 在行级触发器中使用:old和:new 225
9.1.5 使用触发器谓词:INSERTING、UPDATING和DELETING 227
9.2 变化表 229
9.2.1 变化表示例 230
9.2.2 消除变化表错误 231
9.3 使用PL/SQL:实现级联更新 234
9.3.1 实用程序的内容 235
9.3.2 工作原理 238
9.4 小结 242
10.1 什么是异常情态 243
第10章 错误处理 243
10.1.1 声明异常情态 244
10.1.2 触发异常情态 247
10.1.3 处理异常情态 248
10.1.4 EXCEPTION INIT Pragma 253
10.1.5 使用RAISE_APPLICATION ERROR 254
10.2 异常情态传播 256
10.2.1 在执行部分引发的异常情态 256
10.2.2 在声明部分引发的异常情态 259
10.2.3 在异常处理部分引发的异常情态S 260
10.3 异常处理指南 262
10.3.1 异常情态的作用域 262
10.3.2 避免示处理的异常情态 263
10.3.3 屏蔽错误发生的位置 263
10.4 使用PL/SQL:常用错误处理模块 265
10.5 小结 273
第11章 对象 274
11.1 背景介绍 274
11.1.1 面向对象程序设计基础 274
11.1.2 对象关系型数据库 275
11.2 对象类型 276
11.2.1 定义对象类型 276
11.2.2 声明和初始化对象 278
11.2.3 方法 280
11.2.4 更改和删除类型 285
11.2.5 对象依赖性 287
11.3 数据库中的对象 288
11.3.1 对象位置 288
11.3.2 在DML语句中使对象 291
11.3.3 MAP和ORDER方法 295
11.4 小结 298
12.1 嵌套表 299
第12章 集合(Collections) 299
12.1.1 声明嵌套表 299
12.1.2 数据库中的嵌套表 302
12.1.3 嵌套表和索引表 305
12.2 Varrays 306
12.2.1 声明Varray 306
12.2.2 数据库中的Varray 307
12.2.3 Varray和嵌套表 309
12.3 集合方法 310
12.3.1 EXISTS 310
12.3.2 COUNT 311
12.3.3 LIMIT 312
12.3.4 FIRST和LAST 312
12.3.5 NEXT和PRILOR 312
12.3.6 EXTEND 313
12.3.7 TRIM 315
12.3.8 DELETE 317
12.4 小结 319
第13章 PL/SQL执行环境 320
13.1 不同的PL/SQL引擎 320
13.2 服务器端PL/SQL 323
13.2.1 SQL*Plus 323
13.2.2 Oracle预编译器 328
13.2.3 OCI 332
13.2.4 SQL-Station 335
13.3 客户端PL/SQL 338
13.3.1 为什么提供客户端引擎 339
13.3.2 Orade Forms 340
13.3.3 Procedure Builder 341
13.4 PL/SQL Wrapper 343
13.4.1 运行Wrapper 343
13.4.3 检查语法和语义 344
13.4.2 输入和输出文件 344
13.4.4 Wrapper使用指南 345
13.5 小结 345
第14章 测试和调试 346
14.1 问题诊断 346
14.1.1 调试指南 346
14.2 插入测试表 347
14.3 DBMS_OUTPUT 355
14.3.1 The DBMS_OUTPUT 356
14.3.2 问题2 359
14.4 PL/SQL调试器 365
14.5 Procedure Builder 365
14.6 SQL ⊿tation 369
14.7 Procedure Builder和SQL-Station之间的比较 374
14.8 程序设计方法 375
14.8.1 模块化程序设计 375
14.8.2 自顶向下设计 376
14.8.3 数据抽象 376
14.9 小结 377
第15章 动态PL/SQL 378
15.1 前言 378
15.1.1 静态与动态SQL 378
15.1.2 DBMS_SQL概述 379
15.2 执行非查询DML和DDL语句 382
15.2.1 打开游标 382
15.2.2 分析语句 383
15.2.3 联编输入变量 383
15.2.4 执行语句 385
15.2.5 关闭游标 386
15.2.6 示例 386
15.2.7 执行DDL语句 387
15.2.8 执行查询 388
15.2.9 分析语句 389
15.2.10 定义输出变量 389
15.2.11 提取行 391
15.2.12 将结果返回给PL/SQL变量 392
15.2.13 示例 394
15.3 执行PL/SQL 396
15.3.1 分析语句 396
15.3.2 检索输出变量的取值 397
15.3.3 示例 398
15.3.4 使用out_value_size 400
15.4 使用PL/SQL:执行任意内置过程 401
15.5.1 分析大型SQL串 408
15.5 对PL/SQL8.0的DBMS_SQL增强 408
15.5.2 DBMS_SQL数组处理 410
15.5.3 描述选择列表 414
15.6 其他过程 417
15.6.1 提取LONG型数据 417
15.6.2 其他的错误函数 418
15.7 使用PL/SQL:将LONG变量写入FILE变量中 419
15.8 权限和DBMS_SQL 421
15.8.1 DBMS_SQL所需的权限 421
15.8.2 角色和DBMS_SQL 422
15.9 在DBMS_SQL和其他动态方法之间进行比较 422
15.9.4 接口差异 423
15.10 提示和技巧 423
15.9.1 描述选择列表 423
15.9.3 关于LONG型数据的单步操作 423
15.9.2 数组处理 423
15.10.2 权限 424
15.10.3 DDL操作和挂起 424
15.11 小结 424
15.10.1 重用游标 424
第16章 会话间通信 425
16.1 DBMS_PIPE 425
16.1.1 发送信息 429
16.1.2 接收消息 430
16.1.3 创建和管理管道 432
16.1.4 权限和安全性 433
16.1.5 建立通信协议 434
16.1.6 示例 435
16.2 DBMS_ALERT 436
16.2.1 发送警报 442
16.2.2 接收警报 442
16.2.3 其他过程 444
16.2.4 警报和数据字典 444
16.3 比较DBMS-919E和DBMS-A1ERT 446
16.4 小结 447
第17章 Oracle高级排队机制 448
17.1 前言 448
17.1.1 Advanced Queuing的组件 448
17.1.2 Advanced Queuing的实现 450
17.2 队列操作 451
17.2.1 支持类型 451
17.2.2 ENQUEUE 455
17.2.3 DEQUEUE 455
17.3 队列管理 456
17.3.1 DBMS_AQADM子程序 456
17.3.2 队列权限 462
17.3.3 队列和数据字典 462
17.4.1 创建队列和队列表 464
17.4 综合示例 464
17.4.2 简单的Enqueue和Dequeue 466
17.4.3 清除队列 468
17.4.4 按优先级执行enqueue和dequeue 469
17.4.5 按关联标识符或消息标识符执行enqueue和dequeue 470
17.4.6 浏览队列 473
17.4.7 使用异常情态队列 475
17.4.8 删除队列 478
17.5 小结 478
第18章 数据库作业和文件I/O 479
18.1 数据库作业 479
18.1.1 后台进程 479
18.1.2 运行作业 480
18.1.3 失效作业(Broken Jobs) 483
18.1.7 作业执行环境 484
18.1.4 删除作业 484
18.1.5 修改作业 484
18.1.6 查看数据字典中的作业 484
18.2 文件I/O 485
18.2.1 安全性 485
18.2.2 由UTL FILE所引发的异常情态 486
18.2.3 打开和关闭文件 486
18.2.4 文件输出 488
18.2.5 文件输入 491
18.2.6 示例 491
18.3 小结 499
第19章 Oracle 的WebServer程序 500
19.1 WebServer环境 500
19.1.1 PL/SQL代理 501
19.1.2 指定过程参数 502
19.2 PL/SQL Web工具箱 504
19.2.1 HTP和HIF 505
19.2.2 OWA UTIL 517
19.2.3 OWA_IMAGE 525
19.2.4 OWA_COOKIE 527
19.3 用于OWA过程的开发环境 530
19.3.1 OWA_UTIL.SHOWPAGE 530
19.3.2 SQL-Station Coder 531
19.4 小结 532
第20章 外部过程 533
20.1 什么是外部过程 533
20.1.1 必需的步骤 534
20.1.2 参数映射 540
20.1.3 外部函数和包装过程 546
20.2.1 服务例程 548
20.2 数据库的回调 548
20.3 提示、指南和限制 552
20.3.1 调试外部过程 552
20.2.2 在外部过程中执行SQL 552
20.3.2 批南 554
20.3.3 限制 555
20.4 小结 555
第21章 大型对象 556
21.1 什么是LOB 556
21.1.1 LOB存储 557
21.1.2 在DML中使用LOB 558
21.2 操纵BFILE 559
21.2.1 目录 560
21.2.2 打开和关闭BFILE 561
21.2.3 在DML中使用FBILE 561
21.3 DBMS_LOB包 563
21.3.1 DBMS LOB例程 563
21.3.3 DBMS.LOB和OCI 577
21.4 使用PL/SQL:将LONG型数据复制到LOB变量中 579
21.5 小结 581
第22章 性能和调整 582
22.1 共享池 582
22.1.1 Oracle实例的结构 582
22.1.2 共享池的工作原理 585
22.1.3 估计共享池的大小 586
22.1.4 插入对象 588
22.2 SQL语句调整 589
22.2.1 确定执行方案 589
22.3 网络问题 595
22.3.1 使用客户端PL/SQL 595
22.2.2 使用方案 595
22.3.2 避免不必要的重新分析 596
22.3.3 数组处理 596
22.4 小结 596
附录A PL/SQL保留字 597
附录B 包使用指南 600
B.1 创建包 600
B.2 包说明 601
附录C PL/SQL特性的字汇表 615
附录D 数据字典 629
D.1 什么是数据字典 629
D.2 All/User/DBA字典视图 630
D.3 其他数据字典 644
D.4 dbms alert_info 644
D.5 dict_columns 645