Oracle PL/SQL實戰

Oracle875.3.3 PL/Scope1637.5 參數38614.5.3

內容介紹

內容簡介:
本書由15位知名技術專家聯手打造,每位作者分別用一章的篇幅介紹他們最擅長的PL/SQL相關主題,涵蓋了PL/SQL開發的方方面面。本書作者要么是Oracle社區中堅分子,要么是大名鼎鼎的OakTable成員,而且經常活躍在Oracle技術培訓第一線,對PL/SQL均有著深入透徹的理解,對解釋複雜問題有著簡單獨到的方法。一冊在手,眾多PL/SQL牛人的真知灼見盡收眼底,你還等什麼?
本書著重介紹了PL/SQL最新、最實用的特性,從什麼該做和什麼不該做、怎么做對,以及怎么做更有效率、效果更好等三個部分全面闡釋了PL/SQL相關的各個主題。而且,每一章都配有非常貼切的示例代碼、跟蹤圖以及輸出結果,輔以深入淺出的講解,令人在恍然大悟之後不禁拍案叫絕。各章內容均涵蓋了PL/SQL實際開發中的最佳實踐,反映了作者多年積累的經驗和教訓,其價值非同一般。
本書適合具有一定PL/SQL經驗的讀者學習參考。
本書主要內容如下:
掌握使用以及避免使用PL/SQL的最佳時機;
使用批量SQL操作高效地載入數據;?
使用管道指令、並行操作和代碼剖析,提高代碼的擴展性;
為套用選擇正確的PL/SQL游標類型;?
藉助單元測試等有效的開發實踐,減少編碼錯誤;
在運行時動態創建和執行SQL以及PL/SQL。

作者介紹

作者簡介:
John Beresniewicz(約翰?貝雷斯尼維奇)是位於加州紅木城紅木岸(Redwood Shores)的Oracle總部技術團隊的一名諮詢顧問。他於2002年加入Oracle,負責企業管理器的資料庫性能領域,他對診斷和調優包、實時套用測試、支持工作檯和Exadata的設計作出了重要貢獻。多年以來,他經常在Oracle全球大會和其他會議上發言,發言主題包括資料庫性能和PL/SQL編程。他與Steven Fellerstein合著了Oracle Built-in Packages(O’Reilly&Associates,1998年)一書,並且是OakTable網路的創始人之一。
Adrian Billington (阿德里安?比林頓)是套用設計、開發和性能調優方面的顧問。自1999年以來,一直從事Oracle資料庫方面的工作。他是www.oracle-developer.net網站的發起人,這個網站為Oracle開發人員提供各種SQL和PL/SQL功能、實用工具和技術。阿德里安還是Oracle ACE,同時也是OakTable網路的成員。現在,他與妻子安吉和三個孩子:喬治亞、奧利弗和伊莎貝拉一起居住在英國。
Martin Büchi (馬丁?步琪)自2004年以來,任Avaloq公司首席軟體架構師。該公司是一個標準化的銀行軟體供應商,其產品基於Oracle RDBMS構建,包含1100萬行PL/SQL代碼。他與兩位同事一起設計了系統架構,並評審了170名全職PL/SQL開發人員的設計和代碼,以追求軟體的簡明、效率和健壯性。馬丁經常在Oracle大會上發言。2009年,他被Oracle Magazine評選為PL/SQL年度開發人員。從事Oracle資料庫工作之前,馬丁曾在面向對象的系統、形式化方法和近似記錄匹配等領域工作。他擁有瑞士聯邦技術研究所的碩士學位和芬蘭土爾庫計算機科學中心的博士學位。業餘時間,馬丁喜歡與他的家人一起進行各種戶外運動。
Melanie Caffrey (梅拉妮?卡弗里)是Oracle公司高級開發經理,為不同客戶的業務需求提供前端和後端的Oracle解決方案。她是多部技術出版物的合著者,包括Oracle Web Application Programming for PL/SQL Developers、Oracle DBA Interactive Workbook、Oracle Database Administration: The Complete Video Course等,這些書全部由Prentice Hall出版。她在紐約哥倫比亞大學的計算機技術與套用課程中指導學生,教授先進的Oracle資料庫管理和PL/SQL開發。她也經常在Oracle會議上發言。
Ron Crisco(羅恩?克里斯科)28年來分別擔任軟體設計師、開發人員和項目負責人,並有21年的Oracle資料庫工作經驗。他在R方法(Method R)公司從事軟體設計和開發、軟體產品管理(如R方法剖析器、MR工具和MR跟蹤)、諮詢、教授課程等工作。他的特長是簡化複雜的工作,這在幫助他身邊的人完成非凡工作時尤顯寶貴。
Lewis Cunningham(劉易斯?坎寧安)在IT領域已經工作了20多年。自1993年以來一直與Oracle資料庫打交道。他的專長是應用程式設計、資料庫設計,以及大容量的VLDB資料庫編碼。目前他任職於佛羅里達州聖彼得堡的一家金融服務公司,擔任高級資料庫架構師,負責超大規模、高事務率分析型資料庫和應用程式的工作。他花了大量時間來與最新的技術和趨勢保持同步,並在用戶組發表演講,舉辦網路研討會。劉易斯也是一位Oracle ACE總監和Oracle認證專家。他在Oracle技術網發表了數篇文章,並在http://it.toolbox.com/ blogs/oracle-guide維護一個Oracle技術部落格。劉易斯寫了兩本書:EnterpriseDB: The Definitive Reference(Rampant Tech press,2007年)和SQL DML: The SQL Starter Series(CreateSpace,2008年)。他與他的妻子及兩個兒子起住在佛羅里達州。可以通過電子郵件[email protected]與他聯繫。
Dominic Delmolino (多米尼克?德莫里諾)是Agilex技術公司首席Oracle和資料庫技術專家,這是一家專門協助政府和私營企業實現信息價值的諮詢公司。多米尼克擁有24年以上的資料庫經驗,其中擔任過20多年的Oracle資料庫工程和開發專家。他是OakTable網路的成員,並定期出席各種學術會議、研討會,以及歐洲和美國的用戶組會議。他還維護www.oraclemusings.com網站,該網站專注於與資料庫應用程式開發相關的資料庫編碼和設計實踐。多米尼克擁有紐約州伊薩卡康奈爾大學的計算機科學學士學位。
Sue Harper (蘇?哈珀)是資料庫開發工具組中的Oracle SQL Developer和SQL Developer數據建模器的產品經理。她自1992年以來一直在Oracle公司工作,目前在倫敦辦事處工作。蘇是一些雜誌的特約撰稿人,維護著一個技術部落格,並在世界各地的許多會議上發言。她撰寫了技術書籍Oracle SQL Developer 2.1(Packt,2009),業餘時間,蘇喜歡步行和攝影。同時,她還花時間到新德里的貧民區做慈善工作,幫助那裡的婦女和兒童。
Torben Holm (托爾?霍爾姆)自1987年以來一直從事開發工作。自1992年以來,他一直致力於與Oracle相關的工作,前四年擔任系統分析師和應用程式開發人員(Oracle 7、Forms 4.0/Reports 2.0和DBA),然後做了兩年開發(ORACLE6/7、Forms 3.0和RPT以及DBA)。他在Oracle丹麥公司的高級服務組工作了數年,擔任首席高級顧問,執行應用程式開發和DBA任務。他還擔任過PL/SQL、SQL和DBA課程的講師。現在,托爾在Miracle A/S(www.miracleas.dk)工作,擔任顧問,負責套用開發(PLSQL、mod_plsql、Forms、ADF)和資料庫管理。10年來他一直在 Miracle A/S公司工作。他是Oracle認證開發人員,並且也是OakTable網路成員。
Connor McDonald (康納?麥當勞)自20世紀90年代初一直從事Oracle相關工作,他非常熟悉Oracle 6.0.36和Oracle 7.0.12。在過去11年中,康納曾為位於西歐、東南亞、澳大利亞、英國和美國的公司開發過系統。他已經認識到,雖然世界各地的系統及方法非常多樣,但開發在Oracle上運行的系統往往有兩個共同的問題:要么避免使用Oracle特定的功能,要么就是採取不太理想的用法或隨意亂用它們。正是這種觀察,促使他創建了一個提示和技巧的個人網站(www.oracledba.co.uk),並努力在Oracle演講者組織中發表更多演講,以提高PL/SQL的業內認知度和普及度。
Arup Nanda (奧雅納?南大)自1993年以來,一直是Oracle DBA,他熟悉資料庫管理的所有方面,從建模到災難恢復。目前,他在紐約州白原市的喜達屋酒店(即喜來登、威斯汀等連鎖酒店的母公司)領導全球DBA團隊。他是獨立Oracle用戶協會(IOUG)旗下出版物SELECT Journal的特約編輯,在許多Oracle技術盛會,如Oracle全球和本地用戶組(如紐約Oracle用戶組)中發表演講,並為印刷出版物如Oracle Magazine和網路出版物如Oracle Techndogy Network撰寫了許多文章。奧雅納與他人合著了兩本書:Oracle Privacy Security Auditing(Rampant,2003年)和Oracle PL/SQL for DBAs(O’Reilly,2005年)。由於他的專業成就和對用戶社區的貢獻,Oracle評選他為2003年年度DBA。奧雅納與他的妻子Anindita和兒子阿尼什住在康乃狄克州的丹伯里。可以通過[email protected]聯繫他。
Stephan Petit (史蒂芬?佩蒂特)於1995年在位於瑞士日內瓦的歐洲粒子物理實驗室(CERN)開始了他的職業生涯。他現在是一個軟體工程師和學生團隊的負責人,負責為實驗室和其他部門提供應用程式和工具。工程和設備數據管理系統是這些工具之一,也稱為CERN EDMS。像CERN的大型強子對撞機(LHC)項目有40年或以上的生命周期。 EDMS是實驗室的數位化工程的記憶體/記憶體。電子檔案管理系統中存儲了與一百多萬件設備有關的一百多萬份檔案,EDMS也供CERN的產品生命周期管理(PLM)和資產跟蹤系統使用。 EDMS幾乎完全是基於PL/SQL的,並旨在擁有一個至少與LHC一樣長的生命周期。
史蒂芬和他的團隊一直在完善PL/SQL編碼規範和最佳實踐,以滿足他們非常有趣的各種挑戰的組合:幾十年的可維護性、可靠性、高效的錯誤處理、可擴展性、模組的可重用性。團隊成員的頻繁輪換,其中大部分只是暫時在CERN實習的學生,加劇了這些挑戰。最古老的一段代碼是在1995年寫的,現在仍然在使用——並且成功地運行!除了完善PL/SQL,史蒂芬還喜歡不時登台表演,比如擔任CERN搖滾夏季音樂節的搖滾樂隊歌手,以及在多部戲中出演角色。
Michael Rosenblum (麥可?羅森布魯姆)是Dulcian公司的軟體架構師/開發DBA,他負責系統調優和應用程式架構。麥可通過編寫複雜的PL/SQL例程和研究新功能支持Dulcian開發人員。他是PL/SQL for Dummies(Wiley,2006年)一書的作者之一,並在IOUG Select Journal和ODTUG Tech Journal發表了許多篇與資料庫相關的文章。麥可是一位Oracle ACE,也經常出席不同地區和國家的Oracle用戶組大會(Oracle OpenWorld大會、ODTUG、IOUG Collaborate、RMOUG、NYOUG等),他是ODTUG萬花筒2009年“最佳演講獎”得主。在他的家鄉烏克蘭,他獲得了烏克蘭總統獎學金,並擁有信息系統理學碩士學位並以優異成績獲得基輔國立經濟大學畢業證書。
Robyn Sands (羅賓?桑茲)是思科系統公司的軟體工程師,她為思科的客戶設計和開發嵌入式Oracle資料庫產品。自1996年以來,她一直使用Oracle軟體,並在套用開發、大型系統實現和性能測量方面具有豐富經驗。羅賓的職業生涯始於工業工程和質量工程,她將自己對數據的摯愛結合到以前接受的教育和工作經驗中,尋找新方法來建立性能穩定、易於維護的資料庫系統。她是OakTable網路成員,並是下面兩本Oracle書籍的作者之一:Expert Oracle Practices和Pro Oracle SQL(都由Apress出版,2010)。羅賓偶爾在http://adhdocddba. blogspot.com發表一些部落格。
Riyaj Shamsudeen是OraInternals公司首席資料庫管理員和主席,這是一家從事性能調優/資料庫恢復/EBS11i等領域的諮詢公司。他專門研究真正的套用集群(RAC)、性能調優和資料庫內部結構。他還經常在其部落格http://orainternals.wordpress.com上發表這些技術領域的文章。他也經常出席許多國際會議,如HOTSOS、COLLABORATE、RMOUG、SIOUG、UKOUG等,他是OakTable網路的驕傲一員。他擁有16年以上使用Oracle技術產品的經驗,並擔任了15年以上的Oracle/Oracle應用程式資料庫管理員。

作品目錄

目錄
第1章  避免誤用1
1.1  逐行處理1
1.2  嵌套的逐行處理3
1.3  查找式查詢5
1.4  對DUAL的過度訪問8
1.4.1  日期的算術運算8
1.4.2  訪問序列9
1.4.3  填充主—從行9
1.5  過多的函式調用10
1.5.1  不必要的函式調用10
1.5.2  代價高昂的函式調用12
1.6  資料庫連結調用14
1.7  過度使用觸發器15
1.8  過度提交15
1.9  過度解析16
1.10  小結16
第2章  動態SQL:處理未知18
2.1  動態SQL的三種方式19
2.1.1  本地動態SQL19
2.1.2  動態游標21
2.1.3  DBMS_SQL25
2.2  動態思考的樣例26
2.3  安全問題30
2.4  性能和資源利用率33
2.4.1  反模式34
2.4.2  比較動態SQL的實現35
2.5  對象的依賴關係37
2.5.1  負面影響37
2.5.2  正面影響37
2.6  小結38
第3章  PL/SQL和並行處理39
3.1  為什麼需要並行處理39
3.2  影響並行處理的定律40
3.3  大數據的崛起40
3.4  並行與分散式處理41
3.5  並行硬體體系結構41
3.6  確定目標42
3.6.1  加速42
3.6.2  按比例擴展43
3.6.3  並行度43
3.7  用於並行處理的候選工作負載43
3.7.1  並行和OLTP43
3.7.2  並行和非OLTP工作負載44
3.8  MapReduce編程模型44
3.9  在使用PL/SQL之前45
3.10  可用於並行活動的進程45
3.11  使用MapReduce的並行執行伺服器46
3.11.1  管道表函式46
3.11.2  指導60
3.11.3  並行管道表函式小結61
3.12  小結61
第4章  警告和條件編譯62
4.1  PL/SQL 警告62
4.1.1  基礎62
4.1.2  使用警告63
4.1.3  升級警告為錯誤67
4.1.4  忽略警告68
4.1.5  編譯和警告69
4.1.6  關於警告的結束語72
4.2  條件編譯72
4.2.1  基礎72
4.2.2  正在運行代碼的哪部分75
4.2.3  預處理代碼的好處76
4.2.4  有效性驗證78
4.2.5  控制編譯80
4.2.6  查詢變數81
4.2.7  關於條件編譯的結束語82
4.3  小結84
第5章  PL/SQL單元測試85
5.1  為什麼要測試代碼85
5.2  什麼是單元測試86
5.2.1  調試還是測試86
5.2.2  建立測試的時機86
5.3  單元測試構建工具87
5.3.1  utPLSQL:使用命令行代碼87
5.3.2  Quest Code Tester for Oracle87
5.3.3  Oracle SQL Developer88
5.4  準備和維護單元測試環境88
5.4.1  創建單元測試資料檔案庫89
5.4.2  維護單元測試資料檔案庫90
5.4.3  導入測試91
5.5  構建單元測試91
5.5.1  使用單元測試嚮導91
5.5.2  創建第一個測試實施92
5.5.3  添加啟動和拆除進程93
5.5.4  收集代碼覆蓋率統計信息93
5.5.5  指定參數93
5.5.6  添加進程驗證94
5.5.7  保存測試95
5.5.8  調試和運行測試95
5.6  擴大測試的範圍95
5.6.1  創建查找值96
5.6.2  植入測試實施97
5.6.3  創建動態查詢98
5.7  支持單元測試功能99
5.7.1  運行報告99
5.7.2  創建組件庫100
5.7.3  導出、導入和同步測試103
5.7.4  構建套件105
5.8  從命令行運行測試105
5.9  小結106
第6章  批量SQL操作107
6.1  五金商店107
6.2  設定本章的例子108
6.3  在PL/SQL中執行批量操作108
6.3.1  批量獲取入門110
6.3.2  三種集合風格的數據類型112
6.3.3  為什麼要自找麻煩114
6.3.4  監控批量收集的開銷116
6.3.5  重構代碼以使用批量收集119
6.4  批量綁定127
6.4.1  批量綁定入門127
6.4.2  度量批量綁定性能128
6.4.3  監視記憶體的使用131
6.4.4  11g中的改進133
6.5  批量綁定的錯誤處理134
6.5.1  SAVE EXCEPTIONS和分批操作137
6.5.2  LOG ERRORS子句138
6.5.3  健壯的批量綁定139
6.6  大規模集合的正當理由143
6.7  真正的好處:客戶端批量處理145
6.8  小結149
第7章  透識你的代碼151
7.1  本章內容取捨152
7.2  自動代碼分析153
7.2.1  靜態分析154
7.2.2  動態分析154
7.3  執行分析的時機154
7.4  執行靜態分析156
7.4.1  數據字典156
7.4.2  PL/Scope163
7.5  執行動態分析175
7.5.1  DBMS_PROFILER和DBMS_TRACE175
7.5.2  DBMS_HPROF184
7.6  小結189
第8章  契約導向編程190
8.1  契約式設計190
8.1.1  軟體契約190
8.1.2  基本契約要素191
8.1.3  斷言192
8.1.4  參考文獻192
8.2  實現PL/SQL契約192
8.2.1  基本的ASSERT程式192
8.2.2  標準的包本地斷言194
8.2.3  使用ASSERT執行契約196
8.2.4  其他改進198
8.2.5  契約導向函式原型199
8.3  示例:測試奇數和偶數200
8.4  有用的契約模式202
8.4.1  用NOT NULL輸入且輸出NOT NULL202
8.4.2  函式返回NOT NULL203
8.4.3  布爾型函式返回NOT NULL203
8.4.4  檢查函式:返回TRUE或ASSERTFAIL204
8.5  無錯代碼的原則205
8.5.1  嚴格地斷言先決條件205
8.5.2  一絲不苟地模組化206
8.5.3  採用基於函式的接口206
8.5.4  在ASSERTFAIL處崩潰207
8.5.5  對後置條件進行回歸測試207
8.5.6  避免在正確性和性能之間取捨207
8.5.7  採用Oracle 11g最佳化編譯208
8.6  小結209
第9章  從SQL調用PL/SQL210
9.1  在SQL中使用PL/SQL函式的開銷210
9.1.1  上下文切換211
9.1.2  執行216
9.1.3  欠理想的數據訪問218
9.1.4  最佳化器的難點222
9.1.5  讀一致性陷阱226
9.1.6  其他問題228
9.2  降低PL/SQL函式的開銷228
9.2.1  大局觀229
9.2.2  使用SQL的替代品230
9.2.3  減少執行236
9.2.4  協助CBO244
9.2.5  調優PL/SQL255
9.3  小結257
第10章  選擇正確的游標258
10.1  顯式游標258
10.1.1  解剖顯式游標260
10.1.2  顯式游標和批量處理261
10.1.3  REF游標簡介262
10.2  隱式游標263
10.2.1  解剖隱式游標264
10.2.2  隱式游標和額外獲取的理論265
10.3  靜態REF游標267
10.3.1  詳細的游標變數限制清單269
10.3.2  客戶端和REF游標270
10.3.3  有關解析的話題271
10.4  動態REF游標273
10.4.1  例子和最佳用法273
10.4.2  SQL注入的威脅275
10.4.3  描述REF游標中的列276
10.5  小結277
第11章  大規模PL/SQL編程279
11.1  將資料庫作為基於PL/SQL的套用伺服器279
11.1.1  案例研究:Avaloq銀行系統279
11.1.2  在資料庫中使用PL/SQL實現業務邏輯的優勢281
11.1.3  用資料庫作為基於PL/SQL的應用程式伺服器的限制283
11.1.4  軟因素284
11.2  大規模編程的要求284
11.3  通過規範實現一致性285
11.3.1  縮寫詞286
11.3.2  PL/SQL標識符的前綴和後綴289
11.4  代碼和數據的模組化291
11.4.1  包和相關的表作為模組293
11.4.2  含有多個包或子模組的模組297
11.4.3  模式作為模組299
11.4.4  在模式內部模組化303
11.4.5  用模式模組化與在模式內模組化的比較306
11.5  使用PL/SQL面向對象編程306
11.5.1  使用用戶定義類型的面向對象編程307
11.5.2  使用PL/SQL記錄面向對象編程310
11.5.3  評估316
11.6  記憶體管理317
11.6.1  測量記憶體使用317
11.6.2  集合322
11.7  小結325
第12章  漸進式數據建模326
12.1  從二十年的系統開發中總結的經驗327
12.2  資料庫和敏捷開發328
12.3  漸進式數據建模329
12.4  重構資料庫331
12.5  通過PL/SQL創建訪問層335
12.6  敏捷宣言347
12.7  用PL/SQL進行漸進式數據建模349
12.7.1  定義接口349
12.7.2  思考可擴展性349
12.7.3  測試驅動開發350
12.7.4  明智地使用模式和用戶350
12.8  小結351
第13章  性能剖析352
13.1  何謂性能353
13.1.1  功能需求353
13.1.2  回響時間353
13.1.3  吞吐量354
13.1.4  資源利用率354
13.1.5  性能是功能的一種355
13.2  什麼是剖析356
13.2.1  順序圖356
13.2.2  概要檔案之神奇357
13.2.3  性能剖析的好處357
13.3  性能測量358
13.3.1  這個程式為什麼慢358
13.3.2  測量嵌入360
13.3.3  識別360
13.3.4  條件編譯364
13.3.5  內建的剖析器365
13.3.6  擴展的SQL跟蹤數據(事件10046)365
13.3.7  針對Oracle的測量工具庫(ILO)366
13.4  問題診斷368
13.4.1  R方法369
13.4.2  ILO示例371
13.4.3  剖析示例373
13.5  小結376
第14章  編碼規範和錯誤處理378
14.1  為什麼要制訂編碼規範378
14.2  格式化379
14.2.1  大小寫379
14.2.2  注釋380
14.2.3  比較380
14.2.4  縮進380
14.3  動態代碼383
14.4  包384
14.5  存儲過程385
14.5.1  命名385
14.5.2  參數386
14.5.3  調用386
14.5.4  局部變數386
14.5.5  常量386
14.5.6  類型387
14.5.7  全局變數387
14.5.8  本地存儲過程和函式387
14.5.9  存儲過程元數據388
14.6  函式388
14.7  錯誤處理389
14.7.1  錯誤捕獲389
14.7.2  錯誤報告390
14.7.3  錯誤恢復391
14.7.4  先測試再顯示392
14.8  小結392
第15章  依賴關係和失效395
15.1  依賴鏈395
15.2  縮短依賴鏈401
15.3  數據類型引用406
15.4  用於表修改的視圖407
15.5  把組件添加到包410
15.6  依賴鏈中的同義詞413
15.7  資源鎖定414
15.8  用觸發器強制執行依賴415
15.9  創建最初禁用的觸發器418
15.10  小結420

熱門詞條

聯絡我們