第1章 PL/SQL基础 1
1.1创建代码块 1
问题 1
解决方案 1
原理分析 1
1.2在SQL Plus里执行代码块 2
问题 2
解决方案 2
原理分析 2
1.3把代码保存到脚本中 3
问题 3
解决方案 3
原理分析 3
1.4执行脚本 4
问题 4
解决方案 4
原理分析 4
1.5接受用户键盘输入 5
问题 5
解决方案 5
原理分析 5
1.6在SQL Plus里显示结果 7
问题 7
解决方案 7
原理分析 7
1.7在代码中添加注释 8
问题 8
解决方案 8
原理分析 8
1.8引用代码块 9
问题 9
解决方案 9
原理分析 9
1.9从嵌套块中引用变量 10
问题 10
解决方案 10
原理分析 11
1.10忽略替换变量 11
问题 11
解决方案1 11
解决方案2 11
原理分析 12
1.11改变替换变量字符 12
问题 12
解决方案 13
原理分析 13
1.12创建匹配数据库列类型的变量 13
问题 13
解决方案 13
原理分析 14
第2章 基本的SQL操作 15
2.1从数据库检索单行数据 15
问题 15
解决方案1 15
解决方案2 16
原理分析 17
2.2限定列名与变量名 18
问题 18
解决方案 18
原理分析 19
2.3声明与列类型匹配的变量类型 19
问题 19
解决方案 19
原理分析 20
2.4把查询结果返回到PL/SQL记录中 20
问题 20
解决方案 20
原理分析 21
2.5创建自定义记录来接收查询结果 21
问题 21
解决方案 22
原理分析 22
2.6循环遍历查询的行结果 23
问题 23
解决方案1 23
解决方案2 23
原理分析 24
2.7获取环境与会话信息 24
问题 24
解决方案 24
原理分析 25
2.8格式化查询结果 27
问题 27
解决方案 27
原理分析 28
2.9更新查询返回的结果行 28
问题 28
解决方案 28
原理分析 29
2.10更新游标返回的行结果 30
问题 30
解决方案 30
原理分析 31
2.11删除游标返回的行结果 31
问题 31
解决方案 31
原理分析 32
2.12执行事务 32
问题 32
解决方案 32
原理分析 33
2.13确保相同的数据对多个查询“可见” 34
问题 34
解决方案 34
原理分析 34
2.14从事务中执行另一个独立事务 35
问题 35
解决方案 35
原理分析 36
2.15找到并删除重复行数据 37
问题 37
解决方案 37
原理分析 38
第3章 循环与逻辑 39
3.1选择执行代码的时机 39
问题 39
解决方案 39
原理分析 40
3.2两个互斥条件中的抉择 40
问题 40
解决方案 40
原理分析 41
3.3多个互斥条件求值 41
问题 41
解决方案1 41
解决方案2 42
原理分析 43
3.4一个有着多个输出结果的表达式 44
问题 44
解决方案 44
原理分析 45
3.5循环直至满足指定条件 45
问题 45
解决方案 45
原理分析 46
3.6遍历游标结果直到所有行结果都被返回 46
问题 46
解决方案 46
原理分析 47
3.7循环直到条件为FALSE 47
问题 47
解决方案 47
原理分析 48
3.8跳过当前循环迭代 48
问题 48
解决方案 48
原理分析 49
3.9迭代固定次数 50
问题 50
解决方案 50
原理分析 50
3.10逆向迭代 51
问题 51
解决方案 51
原理分析 51
3.11指定其他循环增量 52
问题 52
解决方案 52
原理分析 52
3.12使用奇数作为级数进行遍历 52
问题 52
解决方案 53
原理分析 53
3.13退出外层循环 53
问题 53
解决方案 53
原理分析 54
3.14跳转到代码中的指定位置 55
问题 55
解决方案 55
原理分析 56
第4章 函数、过程与包 57
4.1创建存储函数 57
问题 57
解决方案 57
原理分析 58
4.2从查询中执行存储函数 60
问题 60
解决方案 61
原理分析 61
4.3优化对于某一输入总是返回相同结果的函数 62
问题 62
解决方案 62
原理分析 62
4.4创建存储过程 63
问题 63
解决方案 63
原理分析 64
4.5执行存储过程 64
问题 64
解决方案 65
原理分析 65
4.6在过程或代码块中创建函数 66
问题 66
解决方案 66
原理分析 67
4.7按名称传递参数 67
问题 67
解决方案 67
原理分析 67
4.8设置默认参数值 68
问题 68
解决方案 68
原理分析 68
4.9组织相关程序形成一个独立单元 69
问题 69
解决方案 69
原理分析 70
4.10为包编写初始化代码 71
问题 71
解决方案 71
原理分析 72
4.11授予存储程序的创建与执行权限 73
问题 73
解决方案 73
原理分析 73
4.12执行包中的过程和函数 73
问题 73
解决方案 73
原理分析 74
4.13为存储程序创建公有名称 74
问题 74
解决方案 74
原理分析 75
4.14依次执行包程序 75
问题 75
解决方案 75
原理分析 76
4.15 使用失败标志 77
问题 77
解决方案 77
原理分析 78
4.16将数据访问限制在包内 79
问题 79
解决方案 79
原理分析 79
4.17在你的权限集合下运行存储代码 80
问题 80
解决方案 80
原理分析 80
4.18在一个函数中接受多个参数集合 81
问题 81
解决方案 81
原理分析 81
4.19列举模式中的函数、过程和包 82
问题 82
解决方案 82
原理分析 82
4.20查看存储程序源代码 82
问题 82
解决方案 82
原理分析 83
第5章 触发器 85
5.1自动生成列值 85
问题 85
解决方案 85
原理分析 86
5.2保持关系数据同步 87
问题 87
解决方案 87
原理分析 88
5.3响应表的特定列更新 89
问题 89
解决方案 89
原理分析 89
5.4可更新的视图 90
问题 90
解决方案 90
原理分析 92
5.5改变应用程序的功能 92
问题 92
解决方案 93
原理分析 93
5.6验证输入数据 94
问题 94
解决方案 95
原理分析 95
5.7修正输入数据 95
问题 95
解决方案 95
原理分析 96
5.8替换列值 96
问题 96
解决方案 96
原理分析 97
5.9基于系统事件的触发器 98
问题 98
解决方案 98
原理分析 99
5.10与模式事件相关的触发器 100
问题 100
解决方案 100
原理分析 101
5.11同一事件激活两个触发器 102
问题 102
解决方案 102
原理分析 103
5.12创建响应多个事件的触发器 103
问题 103
解决方案 103
原理分析 105
5.13创建禁用状态的触发器 106
问题 106
解决方案 106
原理分析 107
第6章 类型转换 108
6.1把字符串转换成数字 108
问题 108
解决方案 108
原理分析 109
6.2把字符串转换成日期 109
问题 109
解决方案 109
原理分析 110
6.3把数字转换成字符串 111
问题 111
解决方案 111
原理分析 111
6.4把日期转换成字符串 112
问题 112
解决方案 112
原理分析 113
6.5把字符串转换成时间戳 115
问题 115
解决方案 115
原理分析 116
6.6利用ANSI兼容的方式进行格式转换 116
问题 116
解决方案 116
原理分析 117
6.7 PLS_ INTEGER与NUMBER之间的隐式转换 118
问题 118
解决方案 118
原理分析 119
第7章 数字、字符串和日期 120
7.1字符串拼接 120
问题 120
解决方案 120
原理分析 121
7.2为日期增加天数 121
问题 121
解决方案 121
原理分析 121
7.3为日期增加月数 122
问题 122
解决方案 122
原理分析 123
7.4为日期增加年数 123
问题 123
解决方案 123
原理分析 124
7.5获取两个日期之间的间隔天数 125
问题 125
解决方案 125
原理分析 125
7.6为日期增加小时数、分钟数、秒数或天数 126
问题 126
解决方案 126
原理分析 127
7.7返回指定月份的第一天 129
问题 129
解决方案 129
原理分析 129
7.8返回月份的最后一天 130
问题 130
解决方案 130
原理分析 130
7.9数字的四舍五入 130
问题 130
解决方案 130
原理分析 131
7.10对日期时间值进行四舍五入 131
问题 131
解决方案 131
原理分析 131
7.11以毫秒单位来跟踪时间 132
问题 132
解决方案 132
原理分析 133
7.12把时区与日期和时间关联 133
问题 133
解决方案 133
原理分析 133
7.13利用样式在字符串中搜索 134
问题 134
解决方案 134
原理分析 134
7.14确定指定样式在字符串中的位置 135
问题 135
解决方案 135
原理分析 136
7.15 字符串的查找与替换 137
问题 137
解决方案 137
原理分析 138
第8章 动态SQL 139
8.1执行编译时无法确定的单行查询 139
问题 139
解决方案1 139
解决方案2 140
原理分析1 141
原理分析2 142
8.2执行编译时无法确定的多行查询 142
问题 142
解决方案1 143
解决方案2 143
原理分析 144
8.3编写动态INSERT语句 145
问题 145
解决方案1 145
解决方案2 146
原理分析 147
8.4编写动态更新语句 148
问题 148
解决方案 148
原理分析 151
8.5编写动态删除语句 151
问题 151
解决方案 151
原理分析 152
8.6把动态查询结果数据放入记录中 153
问题 153
解决方案 153
原理分析 154
8.7执行动态PL/SQL块 154
问题 154
解决方案1 154
解决方案2 155
原理分析 155
8.8运行时创建表 156
问题 156
解决方案 156
原理分析 156
8.9运行时修改表 157
问题 157
解决方案 157
原理分析 157
8.10查找出包含特殊字段值的所有表 158
问题 158
解决方案 158
原理分析 160
8.11在大对象中保存动态SQL 161
问题 161
解决方案1 161
解决方案2 162
原理分析 162
8.12向动态SQL传递NULL值 163
问题 163
解决方案 163
原理分析 164
8.13在DMBS_ SOL与原生动态SQL间切换 164
问题 164
解决方案 164
原理分析 166
8.14防止SQL注入攻击 166
问题 166
解决方案 166
原理分析 167
第9章 异常 169
9.1捕获异常 169
问题 169
解决方案 169
原理分析 171
9.2捕获未知异常 173
问题 173
解决方案 173
原理分析 175
9.3创建并抛出命名的自定义异常 175
问题 175
解决方案 175
原理分析 177
9.4判断OTHERS处理程序中发生了哪个错误 177
问题 177
解决方案 177
原理分析 179
9.5抛出用户定义异常 180
问题 180
解决方案 181
原理分析 181
9.6在异常抛出后重定向控制权 182
问题 182
解决方案 183
原理分析 184
9.7抛出异常并继续处理 184
问题 184
解决方案 184
原理分析 185
9.8将无名异常与错误号关联 185
问题 185
解决方案 186
原理分析 186
9.9追踪异常源 187
问题 187
解决方案 187
原理分析 189
9.10显示PL/SQL编译器警告 190
问题 190
解决方案 190
原理分析 191
第10章 PL/SQL集合与记录 193
10.1创建并访问VARRAY 193
问题 193
解决方案 193
原理分析 194
10.2创建并访问索引表 194
问题 194
解决方案 194
原理分析 195
10.3创建简单的记录 195
问题 195
解决方案 195
原理分析 195
10.4创建并访问记录集合 196
问题 196
解决方案 196
原理分析 196
10.5创建并访问哈希数组集合 197
问题 197
解决方案 197
原理分析 198
10.6创建并访问复杂的集合 198
问题 198
解决方案 198
原理分析 200
10.7将集合作为调用参数使用 201
问题 201
解决方案 201
原理分析 202
10.8将集合作为返回参数使用 202
问题 202
解决方案 202
原理分析 203
10.9计算集合元素个数 203
问题 203
解决方案 204
原理分析 204
10.10从集合中删除记录 204
问题 204
解决方案 205
原理分析 205
10.11检查集合中是否存在指定的元素 206
问题 206
解决方案 206
原理分析 207
10.12增加集合大小 207
问题 207
解决方案 207
原理分析 208
10.13集合导航 208
问题 208
解决方案 208
原理分析 209
10.14对集合进行修剪 209
问题 209
解决方案 209
原理分析 210
第11章 自动化日常任务 211
11.1调度重复性作业 211
问题 211
解决方案 211
原理分析 211
11.2用电子邮件发送调度作业的输出 212
问题 212
解决方案 212
原理分析 213
11.3用电子邮件发送作业状态通知 213
问题 213
解决方案 213
原理分析 213
11.4按固定时间间隔刷新物化视图 214
问题 214
解决方案 214
原理分析 216
11.5与远程数据源保持数据同步 216
问题 216
解决方案 217
原理分析 218
11.6计划作业链 218
问题 218
解决方案 218
原理分析 221
第12章 Oracle SQL Developer 223
12.1创建标准的授权数据库连接 223
问题 223
解决方案 223
原理分析 224
12.2获取表的信息 225
问题 225
解决方案 225
原理分析 226
12.3启用显示输出功能 227
问题 227
解决方案 227
原理分析 227
12.4编写并执行PL/SQL 228
问题 228
解决方案 228
原理分析 229
12.5创建并执行脚本 231
问题 231
解决方案 231
原理分析 232
12.6将用户的输入值当作替代变量 233
问题 233
解决方案 233
原理分析 233
12.7保存可以快速访问的代码片段 234
问题 234
解决方案 234
原理分析 234
12.8创建函数 236
问题 236
解决方案 236
原理分析 237
12.9创建存储过程 239
问题 239
解决方案 239
原理分析 240
12.10创建包说明和包体 243
问题 243
解决方案 243
原理分析 243
12.11创建触发器 247
问题 247
解决方案 247
原理分析 247
12.12调试存储代码 250
问题 250
解决方案 250
原理分析 250
12.13在导航器中编译代码 252
问题 252
解决方案 253
原理分析 253
第13章 性能分析与改进 254
13.1安装DBMS_ PROFILER 254
问题 254
解决方案 254
原理分析 255
13.2找出瓶颈 255
问题 255
解决方案 255
原理分析 256
13.3加速读写循环 257
问题 257
解决方案 257
原理分析 258
13.4将较大集合或复杂集合作为OUT参数使用 259
问题 259
解决方案 259
原理分析 260
13.5优化计算密集型代码 260
问题 260
解决方案 261
原理分析 261
13.6改善运行时的初始化时间 262
问题 262
解决方案 262
原理分析 262
第14章 在Web中使用PL/SQL 263
14.1在Web上运行PL/SQL过程 263
问题 263
解决方案 263
原理分析 264
14.2创建生成HTML页面的公用过程集合 265
问题 265
解决方案 265
原理分析 266
14.3创建输入表单 267
问题 267
解决方案 267
原理分析 268
14.4用PL/SQL创建基于Web的报表 270
问题 270
解决方案 270
原理分析 272
14.5显示表中的数据 273
问题 273
解决方案 273
原理分析 274
14.6通过数据库查询创建Web表单下拉列表 274
问题 274
解决方案 274
原理分析 275
14.7创建可排序Web报表 276
问题 276
解决方案 276
原理分析 278
14.8在Web页面之间传递数据 279
问题 279
解决方案 279
原理分析 280
14.9查看调试Web程序时发生的错误信息 280
问题 280
解决方案 281
原理分析 281
14.10用PL/SQL生成JavaScript 282
问题 282
解决方案 282
原理分析 283
14.11生成XML数据 284
问题 284
解决方案 284
原理分析 285
14.12用Ajax创建一个输入表单 286
问题 286
解决方案 286
原理分析 287
第15章 数据库中的Java应用 289
15.1创建Java数据库类 289
问题 289
解决方案 289
原理分析 290
15.2把Java类装载到数据库中 291
问题 291
原理分析 293
15.3把编译后的Java类装载到数据库中 293
问题 293
解决方案 293
原理分析 294
15.4把Java类声明为存储过程 294
问题 294
解决方案 295
原理分析 295
15.5执行Java存储过程 295
问题 295
解决方案 295
原理分析 296
15.6从PL/SQL代码中调用Java存储过程 296
问题 296
解决方案 296
原理分析 297
15.7在PL/SQL与Java之间传递参数 298
问题 298
解决方案 298
原理分析 299
15.8创建与调用Java数据库函数 300
问题 300
解决方案 300
原理分析 301
15.9创建Java数据库触发器 301
问题 301
解决方案 301
原理分析 303
15.10从PL/SQL往Java中传递数据对象 303
问题 303
解决方案 303
原理分析 305
15.11把Java类嵌入PL/SQL包 306
问题 306
解决方案 306
原理分析 307
15.12向数据库中装载Java类库 307
问题 307
解决方案 307
原理分析 309
15.13删除Java类 309
问题 309
解决方案 310
原理分析 310
15.14用Java检索数据库元数据 310
问题 310
解决方案 310
原理分析 311
15.15查询数据库以解决Java编译问题 311
问题 311
解决方案 311
原理分析 312
第16章 从JDBC、 HTTP、 Groovy和Jython中访问PL/SQL 313
16.1通过JDBC访问PL/SQL存储过程 313
问题 313
解决方案 313
原理分析 315
16.2从JDBC中访问PL/SQL存储函数 316
问题 316
解决方案 316
原理分析 317
16.3通过HTTP访问PL/SQL过程 318
问题 318
解决方案 318
原理分析 321
16.4从Jython中访问PL/SQL 322
问题 322
原理分析 324
16.5从Groovy访问PL/SQL 325
问题 325
解决方案 325
原理分析 325
第17章 用utPLSQL进行单元测试 327
17.1使用单元测试来测试PL/SQL代码 327
问题 327
解决方案 327
原理分析 329
17.2安装utPLSQL单元测试框架 329
问题 329
解决方案 329
原理分析 330
17.3构建utPLSQL测试包 331
问题 331
解决方案 331
原理分析 332
17.4编写utPLSQL单元测试过程 332
问题 332
解决方案 333
原理分析 334
17.5运行utPLSQL测试 335
问题 335
解决方案 335
原理分析 338
17.6构建utPLSQL测试套件 338
问题 338
解决方案 338
原理分析 338
17.7运行utPLSQL测试套件 339
问题 339
解决方案 339
原理分析 345
17.8重新配置utPLSQL参数 345
问题 345
解决方案 346
原理分析 346
17.9将utPLSQL测试结果重定向到文件 348
问题 348
解决方案 348
原理分析 348
17.10用Ant自动运行PL/SQL和Java存储过程的单元测试 349
问题 349
解决方案 350
原理分析 351
索引 355