內容介紹
PL/SQL是Oracle資料庫對SQL語言的擴展,它開啟了資料庫中業務邏輯集中化的大門。藉助於PL/SQL,Oracle的很多最新特性都得以嶄露頭角。PL/SQL也是非常成功的Oracle Application Express的基石。本書兩位作者都具有20多年的資料庫套用開發經驗,對使用PL/SQL操作Oracle資料庫的各種問題了如指掌。在本書中,作者將多年的實戰經驗總結為具體案例,通過“問題—原理分析—解決方案”的形式,介紹相關問題的破解方法。本書組織結構別具一格,內容由淺入深,讀者只需瀏覽目錄,從中找到你所面臨的難題,對相關代碼略作修改,難題便可迎刃而解。本書可引領新手走進PL/SQL世界,也可以幫助專業人士在PL/SQL世界中所向披靡。
作者介紹
Josh Juneau具有20多年的軟體開發經驗,他的職業生涯起步於資料庫套用開發。成為Oracle資料庫管理員後,Josh又開始使用PL/SQL為Oracle資料庫開發套用。隨著技術的積累,他開始嘗試將Java加入到PL/SQL套用中,充分利用這兩種技術的強大功能,開發了健壯的Oracle資料庫套用。此後,他又對Jython和Groovy等JVM語言產生了濃厚興趣,與他人合著了The Definitive Guide to Jython(第一作者),他還是Django-Jython項目(http://code.google.com/p/django-jython/)負責人。
Matt Arena
具有25年的Oracle資料庫套用開發經驗。自Web剛剛出現時,Matt就一直致力於基於Web的套用開發,他負責過項目開發生命周期的各階段工作,但他最喜歡資料庫建模和編程。
作品目錄
第1章 PL/SQL 基礎11.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
解決方案111
解決方案211
原理分析12
1.11 改變替換變數字元 12
問題12
解決方案13
原理分析13
1.12 創建匹配資料庫列類型的變數13
問題13
解決方案13
原理分析14
第2章 基本的SQL 操作15
2.1 從資料庫檢索單行數據15
問題15
解決方案115
解決方案216
原理分析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
解決方案141
解決方案242
原理分析43
3.4 一個有著多個輸出結果的表達式44
問題44
解決方案44
原理分析45
3.5 循環直至滿足指定條件45
問題45
解決方案45
原理分析46
3.6 遍歷游標結果直到所有行結果都被返回46
問題46
解決方案46
原理分析47
3.7 循環直到條件為FALSE47
問題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章 動態SQL139
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
解決方案1154
解決方案2155
原理分析155
8.8 運行時創建表156
問題156
解決方案156
原理分析156
8.9 運行時修改表157
問題157
解決方案157
原理分析157
8.10 查找出包含特殊欄位值的所有表158
問題158
解決方案158
原理分析160
8.11 在大對象中保存動態SQL161
問題161
解決方案1161
解決方案2162
原理分析162
8.12 向動態SQL 傳遞NULL 值163
問題163
解決方案163
原理分析164
8.13 在DMBS_SQL 與原生動態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 創建並訪問VARRAY193
問題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 Developer223
12.1 創建標準的授權資料庫連線223
問題223
解決方案223
原理分析224
12.2 獲取表的信息225
問題225
解決方案225
原理分析226
12.3 啟用顯示輸出功能227
問題227
解決方案227
原理分析227
12.4 編寫並執行PL/SQL228
問題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_PROFILER254
問題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/SQL263
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 生成JavaScript282
問題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/SQL322
問題322
原理分析324
16.5 從Groovy 訪問PL/SQL325
問題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