內容簡介
《Oracle PL/SQL程式設計(第5版)(套裝上下冊)》基於Oracle資料庫11g,從PL/SQL編程、PL/SQL程式結構、PL/SQL程式數據、PL/SQL中的SQL、PL/SQL套用構建、高級PL/SQL主題這6個方面詳細系統地討論了PL/SQL以及如何有效地使用它。《Oracle PL/SQL程式設計(第5版)(套裝上下冊)》能夠幫助你充分利用PL/SQL來解決資料庫開發中遇到的各種問題,引導你掌握各種構建套用的技巧和技術,以便使你編寫出高效、可維護的代碼。《OraclePL/SQL程式設計(第5版)》不但介紹了大量的Oracle11g的PL/SQL新性能,還提供了許多最佳化PL/SQL性能的新方法。
《OraclePL/SQL程式設計(第5版)》結構清晰,示例豐富,實踐性強,適用於Oracle資料庫開發人員、Oracle資料庫管理員等相關資料庫從業人員,也可以作為各大、中專院校相關專業師生的參考用書和相關培訓機構的培訓教材。
編輯推薦
《Oracle PL/SQL程式設計(第5版)(套裝上下冊)》:近15年來,成千上萬的PL/SQL程式設計師——無論是初學者還是經驗豐富的開發者——都同樣需要依賴《oracle PL/SQL程式設計》來幫助他們充分掌握和套用這門功能強大的語言。第5版是基於Oracle資料庫11g的R1、R2兩個版本的最新版,包含了語法、建議、大量實例和許多新的信息。了解新特徵,包括基於版本的重定義功能、函式結果快取功能、CONTINUE語句、複合觸發器和針對大對象的SecureFiles。使用工具和技巧來最佳化PL/sQL性能,例如PL/Scope和PL/SQL沖的層次化profiler。探討了數據類型、條件控制語句和順序控制語句、循環、異常處理、安全特性、全球化和本地化問題,以及PL/SQL架構。通過使用過程、函式、觸發器和包,建立模組化的PL/SQL套用。Steven Feuerstein是Oracle PL/sQL領域全球最領先的專家之一。作為10本PL/sQL書籍的作者,他從1980年開始從事軟體開發,現在是Quest軟體公司的PL/sQL布道者。
媒體推薦
對於應用程式開發人員而盲,Oracle資料庫11g中出現的一些關鍵的新特徵和性能使得PL/SQL這門語言更加重要。在這一版中,Steven Feuerstein和Bill Priby對於如何使用PL/SQL給出了更有價值的指導。他們非同尋常的見解和觀點將會幫助應用程式開發人員充分利用PL/SQL的所有新性能,並且最大限度地發揮應用程式的性能。
大量實例和清晰的講解使讀者不僅可以輕鬆掌握如何使用PL/SQL的特性,而且能夠理解針對特殊套用需求為什麼要這么做。對於建立基於Oracle的套用的開發者而言,深入理解PL/SQL知識的重要性是不言而喻的。而對於每一位想學好PL/SQL的人來說,這本書都是至關重要的。
——Ken Jacobs
Oracle公司產品戰略副總裁
很久以來,對於每一位認真的PL/SQL開發人員來說,這本書都是必不可少的。引人入勝的敘述方式使得這本書成為我書桌上不可或缺的一員。
——Alex De Vergori
Betfair有限公司資料庫架構師
Oracle雜誌2008年年度PL/SQL開發者
目錄
Oracle PL/SQL程式設計(第5版)(上冊)目錄:
第1部分 PL/SQL編程
第1章 PL/SQL概述 3
1.1 什麼是PL/SQL? 3
1.2 PL/SQL的起源 4
1.2.1 早期的PL/SQL 4
1.2.2 改進的應用程式移植能力 5
1.2.3 改進的執行授權和事務一致性 5
1.2.4 低調地起步,穩定地前進 6
1.3 這就是PL/SQL 6
1.3.1 與SQL整合 7
1.3.2 控制和條件邏輯 8
1.3.3 出現錯誤了 9
1.4 關於PL/SQL的版本 10
1.4.1 Oracle資料庫11g的新特性 12
1.5 PL/SQL開發人員的資源 15
1.5.1 O’Reilly PL/SQL系列 16
1.5.2 網路上的PL/SQL 17
1.6 一些建議 18
1.6.1 不要太著急 18
1.6.2 不要怕尋求幫助 19
1.6.3 採用一種創建新的甚至激進的方法 20
第2章 創建並運行PL/SQL代碼 21
2.1 在資料庫中導航 21
2.2 創建和編輯原始碼 22
2.3 SQL*Plus 23
2.3.1 啟動SQL*Plus 24
2.3.2 運行一個SQL語句 26
2.3.3 運行PL/SQL程式 26
2.3.4 運行腳本 28
2.3.5 什麼是“當前目錄” 29
2.3.6 其他SQL*Plus任務 30
2.3.7 SQL*Plus中的錯誤處理 34
2.3.8 喜歡或者討厭SQL*Plus的原因 34
2.4 執行必要的PL/SQL任務 35
2.4.1 創建存儲過程 35
2.4.2 執行存儲過程 39
2.4.3 顯示存儲過程 39
2.4.4 存儲程式的授權和別名 40
2.4.5 刪除存儲程式 41
2.4.6 隱藏存儲過程的原始碼 41
2.5 編輯PL/SQL的環境 42
2.6 在其他語言中調用PL/SQL 43
2.6.1 C:使用Oracle的預編譯器(Pro*C) 44
2.6.2 Java:使用JDBC 45
2.6.3 Perl:使用Perl DBI和DBD:Oracle 46
2.6.4 PHP:使用Oracle擴展 47
2.6.5 PL/SQL Server Pages 48
2.6.6 其他 49
第3章 語言基礎 50
3.1 PL/SQL塊結構 50
3.1.1 匿名塊 52
3.1.2 命名塊 53
3.1.3 嵌套塊 54
3.1.4 作用範圍 55
3.1.5 規範SQL語句中所有對變數和列的引用 56
3.1.6 可見性 58
3.2 PL/SQL字元集 61
3.3 標識符 63
3.3.1 保留字 64
3.3.2 空白和關鍵字 66
3.4 直接量 66
3.4.1 NULL 67
3.4.2 在一個直接量字元串中嵌入單引號 68
3.4.3 數字直接量 69
3.4.4 布爾直接量 70
3.5 分號分隔設定 70
3.6 注釋 70
3.6.1 單行注釋語法 71
3.6.2 多行注釋語法 71
3.7 PRAGMA關鍵字 72
3.8 標籤 73
第2部分 PL/SQL程式結構
第4章 條件和順序控制 77
4.1 IF語句 77
4.1.1 IF-THEN組合 78
4.1.2 IF-THEN-ELSE組合 80
4.1.3 IF-THEN-ELSIF組合 81
4.1.4 避免IF語法陷阱 82
4.1.5 嵌套的IF語句 84
4.1.6 短路求值 84
4.2 CASE語句和表達式 86
4.2.1 簡單的CASE語句 87
4.2.2 搜尋型CASE語句 88
4.2.3 嵌套的CASE語句 90
4.2.4 CASE表達式 91
4.3 GOTO語句 93
4.4 NULL語句 94
4.4.1 增加程式的可讀性 94
4.4.2 在標籤之後使用NULL 95
第5章 用循環進行疊代處理 96
5.1 循環的基礎知識 96
5.1.1 不同循環的例子 97
5.1.2 PL/SQL循環結構 98
5.2 簡單循環 99
5.2.1 終止簡單循環:EXIT和EXIT WHEN 100
5.2.2 模仿一個REPEAT UNTIL循環 101
5.2.3 人為的無限循環 101
5.3 WHILE循環 103
5.4 數值型的FOR循環 104
5.4.1 使用數值型FOR循環的規則 105
5.4.2 數值型FOR循環的例子 105
5.4.3 處理非平滑增長 106
5.5 游標FOR循環 107
5.5.1 游標型FOR循環的例子 108
5.6 循環的標籤 109
5.7 CONTINUE語句 110
5.8 疊代處理的技巧 113
5.8.1 循環索引使用容易理解的名稱 113
5.8.2 好的退出方式 114
5.8.3 獲得FOR循環執行信息 115
5.8.4 循環式的SQL語句 116
第6章 異常處理 118
6.1 異常處理概念和術語 118
6.2 定義異常 120
6.2.1 聲明有名異常 121
6.2.2 異常名稱和錯誤代碼相互關聯 122
6.2.3 被命名的系統異常 125
6.2.4 異常的作用範圍 127
6.3 拋出異常 128
6.3.1 RAISE語句 128
6.3.2 使用RAISE_APPLICATION_ERROR 129
6.4 處理異常 130
6.4.1 內置的錯誤函式 132
6.4.2 在一個單獨的句柄中包含多個異常 137
6.4.3 未處理的異常 137
6.4.4 傳播未處理異常 138
6.4.5 異常後繼續 140
6.4.6 WHEN OTHERS的處理代碼 142
6.5 構建一個有效的錯誤管理架構 144
6.5.1 確定異常管理策略 145
6.5.2 組織好對套用專有錯誤代碼的使用 148
6.5.3 使用標準化的錯誤管理程式 149
6.5.4 使用自己的異常對象 151
6.5.5 創建通用錯誤處理的標準模板 153
6.6 充分利用PL/SQL錯誤管理 155
第3部分 PL/SQL數據
第7章 使用數據 159
7.1 程式數據的命名 159
7.2 PL/SQL數據類型概述 161
7.2.1 字元數據 162
7.2.2 數字 162
7.2.3 日期、時間戳和時間間隔 163
7.2.4 布爾類型 164
7.2.5 二進制數據類型 164
7.2.6 ROWIDs 165
7.2.7 REF CURSORs 165
7.2.8 Internet數據類型 165
7.2.9 “Any”數據類型 166
7.2.10 用戶定義數據類型 166
7.3 程式數據的聲明 166
7.3.1 聲明一個變數 167
7.3.2 聲明常量 168
7.3.3 NOT NULL語句 168
7.3.4 錨定聲明 168
7.3.5 游標和表的錨 170
7.3.6 使用錨定聲明的好處 171
7.3.7 NOT NULL數據類型的錨 172
7.4 程式設計師定義的子類型 173
7.5 數據類型轉換 174
7.5.1 隱式類型轉換 174
7.5.2 顯式類型轉換 176
第8章 字元串 182
8.1 字元串類型 182
8.1.1 VARCHAR2數據類型 183
8.1.2 CHAR數據類型 184
8.1.3 String子類型 185
8.2 使用字元串 186
8.2.1 字元串常量 186
8.2.2 不可列印字元 187
8.2.3 拼接字元串 188
8.2.4 處理大小寫 189
8.2.5 傳統的檢索、提取和替換 192
8.2.6 補齊 194
8.2.7 正則表達式的檢索、提取和替換 197
8.2.8 使用空字元串 208
8.2.9 混用CHAR和VARCHAR2 210
8.3 字元串函式快速參考 212
第9章 數字 221
9.1 數值型數字類型 221
9.1.1 NUMBER類型 222
9.1.2 PLS_INTEGER類型 227
9.1.3 BINARY_INTEGER類型 228
9.1.4 SIMPLE_INTEGER類型 228
9.1.5 BINARY_FLOAT和BINARY_DOUBLE類型 230
9.1.6 SIMPLE_FLOAT和SIMPLE_DOUBLE類型 235
9.1.7 數字子類型 235
9.2 數字轉換 237
9.2.1 TO_NUMBER函式 237
9.2.2 TO_CHAR函式 240
9.2.3 CAST函式 246
9.2.4 隱式轉換 246
9.3 數字運算符 248
9.4 數字函式 249
9.4.1 四捨五入和截斷函式 249
9.4.2 三角函式 250
9.4.3 數字函式的快速參考 250
第10章 日期和時間戳 255
10.1 Datatime數據類型 255
10.1.1 聲明日期時間變數 258
10.1.2 選擇日期時間數據類型 259
10.2 得到當前日期和時間 259
10.3 INTERVAL數據類型 262
10.3.1 聲明INTERVAL變數 263
10.3.2 什麼時候使用INTERVAL 264
10.4 日期時間轉換 266
10.4.1 從字元串到日期時間 266
10.4.2 從日期時間到字元串 269
10.4.3 使用時區 271
10.4.4 精確匹配需要格式掩碼 274
10.4.5 讓精確匹配更容易 275
10.4.6 解釋滑動視窗中兩位數字的年份 275
10.4.7 把時區轉換成字元串 276
10.4.8 用填充模式把輸出補齊 277
10.5 日期和時間戳直接量 278
10.6 時間間隔的轉換 279
10.6.1 從數字到時間間隔的轉換 280
10.6.2 把字元串轉換成間隔 281
10.6.3 時間間隔的格式化顯示 281
10.7 時間間隔直接量 282
10.8 CAST和EXTRACT 284
10.8.1 CAST函式 284
10.8.2 EXTRACT函式 285
10.9 日期時間的算法 286
10.9.1 時間間隔和日期時間的算法 286
10.9.2 DATE數據類型的日期算法 287
10.9.3 計算兩個日期時間之間的時間間隔 288
10.9.4 DATE和TIMESTAMP混合計算 290
10.9.5 時間間隔的加減運算 291
10.9.6 時間間隔的乘除運算 292
10.9.7 使用不受限制的時間間隔類型 293
10.10 日期/時間函式的快速參考 294
第11章 記錄類型 297
11.1 PL/SQL中的記錄 297
11.1.1 使用記錄的好處 298
11.1.2 聲明記錄 300
11.1.3 程式設計師自定義的記錄類型 301
11.1.4 使用記錄類型 304
11.1.5 記錄的比較 310
11.1.6 觸發器偽記錄 311
第12章 集合 313
12.1 集合概述 314
12.1.1 集合概念和術語 314
12.1.2 集合類型 316
12.1.3 集合示例 317
12.1.4 使用集合的場合 321
12.1.5 選擇一個集合類型 326
12.2 集合方法(內置) 327
12.2.1 COUNT方法 328
12.2.2 DELETE方法 329
12.2.3 EXISTS方法 330
12.2.4 EXTEND方法 331
12.2.5 FIRST和LAST方法 332
12.2.6 LIMIT方法 333
12.2.7 PRIOR和NEXT方法 333
12.2.8 TRIM方法 334
12.3 使用集合 335
12.3.1 聲明集合類型 336
12.3.2 集合變數的聲明和初始化 340
12.3.3 用數據填充集合 345
12.3.4 訪問集合內的數據 350
12.3.5 使用字元串索引的集合 350
12.3.6 複雜數據類型的集合 356
12.3.7 多級集合 359
12.3.8 在SQL中使用集合 367
12.4 嵌套表的多重集合操作 372
12.4.1 測試嵌套表是否相等及成員屬性 374
12.4.2 檢查元素是否是嵌套表的成員 375
12.4.3 執行高級集合操作 376
12.4.4 處理嵌套表中的重複數據 377
12.5 模式級別集合的維護 379
12.5.1 必需的許可權 379
12.5.2 集合和數據字典 379
第13章 其他數據類型 381
13.1 BOLEAN類型 381
13.2 RAW數據類型 382
13.3 UROWID和ROWID數據類型 383
13.3.1 獲得ROWID 384
13.3.2 使用ROWID 384
13.4 LOB數據類型 386
13.5 使用LOB 387
13.5.1 理解LOB定位符 389
13.5.2 LOB的空和NULL 390
13.5.3 向LOB中寫入數據 392
13.5.4 讀取LOB數據 395
13.5.5 BFILE不同於其他 396
13.5.6 SecureFiles和BasicFiles 401
13.5.7 臨時LOB 403
13.5.8 原生的LOB操作 406
13.5.9 LOB轉換函式 410
13.6 預定義的對象類型 411
13.6.1 XMLType類型 411
13.6.2 URI類型 415
13.6.3 Any類型 417
第4部分 PL/SQL中的SQL
第14章 DML和事務管理 423
14.1 PL/SQL中的DML 424
14.1.1 DML語句的快速入門 424
14.1.2 DML操作的游標屬性 428
14.1.3 從DML語句返回信息 429
14.1.4 DML和異常處理 430
14.1.5 DML和記錄 431
14.2 事務管理 434
14.2.1 COMMIT語句 434
14.2.2 ROLLBACK語句 435
14.2.3 SAVEPOINT語句 436
14.2.4 SET TRANSACTION命令 436
14.2.5 LOCK TABLE語句 437
14.3 自治事務 438
14.3.1 定義自治事務 438
14.3.2 自治事務的規則和限制 439
14.3.3 事務的可見性 440
14.3.4 什麼時候使用自治事務 440
14.3.5 構建一個自治的日誌機制 441
第15章 數據提取 444
15.1 游標基礎 445
15.1.1 一些有關數據提取的術語 446
15.1.2 典型的查詢操作 447
15.1.3 游標屬性介紹 448
15.1.4 在游標中使用PL/SQL變數 451
15.1.5 在顯式游標和隱式游標間做選擇 451
15.2 使用隱式游標 452
15.2.1 隱式游標的例子 453
15.2.2 隱式游標的異常處理 454
15.2.3 隱式SQL的游標屬性 456
15.3 使用顯式游標 458
15.3.1 聲明顯式游標 459
15.3.2 打開顯式游標 462
15.3.3 從顯式游標中提取數據 463
15.3.4 顯式游標中的列別名 464
15.3.5 關閉顯式游標 465
15.3.6 顯式游標的屬性 467
15.3.7 游標參數 469
15.4 SELECT…FOR UPDATE 472
15.4.1 用COMMIT釋放鎖資源 473
15.4.2 WHERE CURRENT OF語句 474
15.5 游標變數和REF CURSOR 475
15.5.1 為什麼用游標變數 476
15.5.2 和靜態游標的相同點 477
15.5.3 聲明REF CURSOR類型 478
15.5.4 聲明游標變數 478
15.5.5 打開游標變數 479
15.5.6 從一個游標變數獲取數據 480
15.5.7 游標變數的使用規則 483
15.5.8 游標變數作為參數傳遞 486
15.5.9 游標變數的約束限制 488
15.6 游標表達式 488
15.6.1 使用游標表示式 489
15.6.2 游標表達式的約束限制 491
第16章 動態SQL和動態PL/SQL 492
16.1 NDS語句 493
16.1.1 EXECUTE IMMEDIATE語句 493
16.1.2 OPEN FOR語句 496
16.1.3 4種動態SQL方法 502
16.2 綁定變數 503
16.2.1 參數模式 504
16.2.2 重複的占位符 506
16.2.3 NULL值的傳遞 507
16.3 使用對象和集合 508
16.4 動態PL/SQL 510
16.4.1 構建動態PL/SQL塊 511
16.4.2 用動態塊替換重複的代碼 513
16.5 NDS的建議 513
16.5.1 對於共享的程式使用調用者許可權 514
16.5.2 預估並處理動態的錯誤 514
16.5.3 使用綁定而不是拼接 516
16.5.4 把代碼注入的風險最小化 518
16.6 什麼時候使用DBMS_SQL 521
16.6.1 解析非常長的字元串 521
16.6.2 得到查詢的列的信息 522
16.6.3 實現第4種方法的動態SQL的需求 524
16.6.4 把動態游標的解析最小化 530
16.7 Oracle資料庫11g新特性 532
16.7.1 DBMS_SQL TO_REFCURSOR函式 532
16.7.2 DBMS_SQL TO_CURSOR函式 534
16.7.3 DBMS_SQL的安全性增強 536
Oracle PL/SQL程式設計(第5版)(下冊)目錄:
第5部分 構造PL/SQL應用程式
第17章 過程、函式與參數 543
17.1 代碼模組化 543
17.2 過程 545
17.2.1 調用一個過程 547
17.2.2 過程的頭部 548
17.2.3 過程體 548
17.2.4 END標籤 548
17.2.5 RETURN語句 549
17.3 函式 549
17.3.1 函式的結構 549
17.3.2 返回的數據類型 552
17.3.3 END標籤 552
17.3.4 調用函式 553
17.3.5 不帶參數的函式 554
17.3.6 函式的頭部 554
17.3.7 函式體 555
17.3.8 RETURN語句 555
17.4 參數 557
17.4.1 定義參數 558
17.4.2 形參和實參 558
17.4.3 參數模式 559
17.4.4 在PL/SQL中明確地把形參和實參關聯在一起 562
17.4.5 NOCOPY參數模式限定符 566
17.4.6 預設值 566
17.5 局部或者嵌套模組 567
17.5.1 使用局部模組的好處 568
17.5.2 局部模組的作用範圍 571
17.5.3 用局部模組讓我們的代碼更整潔 571
17.6 模組重載 572
17.6.1 使用重載的好處 573
17.6.2 重載的限制 576
17.6.3 關於數字類型的重載 576
17.7 前置聲明 577
17.8 高級主題 579
17.8.1 在SQL中調用我們的函式 579
17.8.2 表函式 581
17.8.3 確定性函式 591
17.9 把模組化進行到底 592
第18章 包 593
18.1 為什麼是包? 593
18.1.1 演示包的能力 594
18.1.2 有關包的一些概念 597
18.1.3 圖示私有性 599
18.2 構建包的規則 599
18.2.1 包規範 600
18.2.2 包體 601
18.2.3 包的初始化 603
18.3 包成員的調用規則 607
18.4 使用包數據 608
18.4.1 在一個Oracle會話內全局可見 609
18.4.2 全局公有數據 609
18.4.3 包游標 610
18.4.4 包的串列化 614
18.5 何時使用包 617
18.5.1 封裝對數據的訪問 617
18.5.2 避免直接量的硬編碼 620
18.5.3 改善內置特性的可用性 622
18.5.4 把邏輯上相關的功能組織在一起 623
18.5.5 快取靜態的會話數據 624
18.6 包和對象類型 624
第19章 觸發器 626
19.1 DML觸發器 627
19.1.1 DML觸發器的概念 628
19.1.2 創建DML觸發器 630
19.1.3 DML觸發器的例子:不許作弊! 635
19.1.4 同一類型的多個觸發器 641
19.1.5 何去何從 642
19.1.6 突變表的錯誤 644
19.1.7 複合觸發器:聚集一堂 645
19.2 DDL觸發器 648
19.2.1 創建DDL觸發器 649
19.2.2 可用事件 651
19.2.3 可用屬性 652
19.2.4 使用事件和屬性 653
19.2.5 刪除不可刪除的 657
19.2.6 INSTEAD OF CREATE 觸發器 657
19.3 資料庫事件觸發器 659
19.3.1 創建資料庫事件觸發器 659
19.3.2 STARTUP觸發器 660
19.3.3 SHUTDOWN觸發器 661
19.3.4 LOGON觸發器 661
19.3.5 LOGOFF觸發器 661
19.3.6 SERVERERROR觸發器 662
19.4 INSTEAD OF觸發器 666
19.4.1 創建INSTEAD OF觸發器 666
19.4.2 INSTEAD OF INSERT觸發器 668
19.4.3 INSTEAD OF UPDATE觸發器 670
19.4.4 INSTEAD OF DELETE觸發器 671
19.4.5 填充表 671
19.4.6 嵌套表的INSTEAD OF觸發器 672
19.5 AFTER SUSPEND觸發器 674
19.5.1 構建AFTER SUSPEND觸發器 674
19.5.2 看看真實的觸發器 676
19.5.3 ORA_SPACE_ERROR_INFO函式 677
19.5.4 DBMS_RESUMABLE包 678
19.5.5 捕獲多個時間 679
19.5.6 該不該處理? 680
19.6 管理觸發器 680
19.6.1 禁用、啟用以及刪除觸發器 680
19.6.2 創建一個禁用的觸發器 681
19.6.3 查看觸發器 682
19.6.4 檢查觸發器的有效性 684
第20章 管理PL/SQL代碼 685
20.1 管理資料庫內的代碼 686
20.1.1 數據字典視圖概述 687
20.1.2 顯示存儲對象的信息 688
20.1.3 原始碼的顯示和搜尋 689
20.1.4 根據程式的大小確定Pinning需求 691
20.1.5 獲得存儲代碼的屬性 692
20.1.6 通過視圖分析和更改觸發器狀態 693
20.1.7 分析參數信息 693
20.1.8 分析標識符的使用(Oracle 資料庫11g的PL/Scope) 695
20.2 依賴關係的管理以及代碼的重編譯 697
20.2.1 通過數據字典視圖分析依賴關係 698
20.2.2 細粒度依賴(Oracle資料庫11g) 702
20.2.3 遠程依賴 703
20.2.4 Oracle的遠程調用模式的限制 706
20.2.5 失效的程式單元的重編譯 707
20.3 編譯時刻警告 711
20.3.1 一個入門例子 711
20.3.2 啟用編譯時刻警告 712
20.3.3 一些有用的警告 714
20.4 PL/SQL程式的測試 722
20.4.1 典型的、華而不實的測試技術 723
20.4.2 PL/SQL代碼測試的一般建議 726
20.4.3 PL/SQL的自動測試選項 727
20.4.4 用utPLSQL測試 728
20.4.5 用Quest Code Tester for Oracle測試 730
20.5 跟蹤PL/SQL的執行 732
20.5.1 DBMS_APPLICATION_INFO 734
20.5.2 Quest Error Manager跟蹤 736
20.5.3 DBMS_TRACE功能 738
20.6 PL/SQL程式的調試 741
20.6.1 錯誤的調試方法 741
20.6.2 調試技巧和策略 743
20.7 保護存儲過程代碼 747
20.7.1 包裝的約束和限制 747
20.7.2 使用包裝功能 748
20.7.3 通過DBMS_DDL動態包裝 748
20.7.4 包裝過的代碼的使用指南 749
20.8 基於版本的重定義(Oracle資料庫11g R2版本) 750
第21章 PL/SQL的性能最佳化 753
21.1 輔助最佳化的工具 754
21.1.1 記憶體使用分析 755
21.1.2 發現PL/SQL代碼中的瓶頸所在 755
21.1.3 計算消耗時間 760
21.1.4 選擇最快的程式 762
21.1.5 避免無限循環 763
21.1.6 性能相關警告 764
21.2 最佳化過的編譯器 765
21.2.1 最佳化器的工作原理 766
21.2.2 循環Fetch操作的運行時最佳化 769
21.3 數據快取技術 770
21.3.1 基於包的快取 771
21.3.2 確定性函式的快取 776
21.3.3 函式結果快取(Oracle資料庫11g) 778
21.3.4 快取總結 790
21.4 多行SQL的批處理 790
21.4.1 通過BULK COLLECT加速查詢 792
21.4.2 通過FORALL加速DML 798
21.5 利用管道化的表函式提升性能 808
21.5.1 用基於管道化函式的載入方式替換基於行的插入 809
21.5.2 用管道函式調優Merge操作 816
21.5.3 用並行管道函式進行異步的數據卸載 818
21.5.4 並行管道函式中的分區子句和流子句對性能的影響 822
21.5.5 管道函式和基於成本的最佳化器 823
21.5.6 用管道函式最佳化複雜的數據載入 829
21.5.7 管道函式結束語 836
21.6 專用的最佳化技術 837
21.6.1 使用NOCOPY參數模式提示符 837
21.6.2 使用正確的數據類型 840
21.7 回顧性能 841
第22章 I/O操作和PL/SQL 843
22.1 顯示信息 843
22.1.1 啟用DBMS_OUTPUT 844
22.1.2 向快取中寫入行 844
22.1.3 從快取中讀取內容 845
22.2 檔案的讀寫 846
22.2.1 UTL_FILE_DIR參數 847
22.2.2 使用Oracle目錄 848
22.2.3 打開檔案 850
22.2.4 檔案已經打開了嗎? 852
22.2.5 關閉檔案 852
22.2.6 讀取檔案 853
22.2.7 向檔案中寫 855
22.2.8 拷貝檔案 858
22.2.9 刪除檔案 859
22.2.10 檔案改名和檔案移動 859
22.2.11 提取檔案屬性 860
22.3 傳送郵件 861
22.3.1 Oracle的前提條件 862
22.3.2 配置網路安全 863
22.3.3 傳送一個短的(32 767或者更少)的純文本訊息 863
22.3.4 在郵件地址中加上“友好”的名字 865
22.3.5 傳送任意長度的純文本訊息 866
22.3.6 傳送帶有小附屬檔案(32 767)的訊息 867
22.3.7 以附屬檔案形式傳送一個小檔案(32 767) 869
22.3.8 任意大小的附屬檔案 870
22.4 使用Web數據(HTTP) 872
22.4.1 “分片”獲得一個Web頁面 873
22.4.2 把頁面提取到一個LOB中 874
22.4.3 使用HTTP的用戶名/密碼驗證 875
22.4.4 獲取一個SSL加密的Web頁面(通過HTTPS) 876
22.4.5 通過GET或者POST給一個Web頁面提交數據 877
22.4.6 禁用Cookies或者Cookies持久化 881
22.4.7 從FTP伺服器獲取數據 881
22.4.8 使用代理伺服器 882
22.5 PL/SQL中可用的其他I/O類型 882
22.5.1 資料庫管道、佇列、告警 883
22.5.2 TCP Socket 883
22.5.3 Oracle的內置Web伺服器 883
第6部分 高級PL/SQL主題
第23章 套用安全與PL/SQL 887
23.1 安全概述 887
23.2 加密 888
23.2.1 密鑰長度 890
23.2.2 算法 890
23.2.3 填補和連線 892
23.2.4 DBMS_CRYPTO包 892
23.2.5 數據加密 894
23.2.6 LOB的加密 897
23.2.7 安全檔案 897
23.2.8 數據解密 898
23.2.9 生成密鑰 899
23.2.10 密鑰管理 900
23.2.11 加密散列 905
23.2.12 使用訊息驗證碼 907
23.2.13 使用透明數據加密(TDE) 908
23.2.14 透明的表空間加密 910
23.3 行級安全 912
23.3.1 為什麼要學習RLS 914
23.3.2 一個簡單的RLS示例 915
23.3.3 使用動態策略 919
23.3.4 使用列敏感的RLS 923
23.3.5 RLS調試 927
23.4 應用程式上下文 930
23.4.1 使用應用程式上下文 931
23.4.2 上下文的安全 932
23.4.3 把上下文用作RLS的謂詞條件 933
23.4.4 識別出非資料庫的用戶 936
23.5 細粒度審計 938
23.5.1 為什麼要學習FGA 939
23.5.2 一個簡單的FGA示例 940
23.5.3 訪問多少列 942
23.5.4 查看審計跟蹤信息 943
23.5.5 使用綁定變數 943
23.5.6 使用句柄模組 945
第24章 PL/SQL架構 947
24.1 DIANA是誰(或者是什麼) 947
24.2 Oracle是如何執行PL/SQL代碼的 948
24.2.1 一個例子 949
24.2.2 編譯器的限制 952
24.3 PL/SQL的預設包 952
24.4 執行許可權模型 955
24.4.1 定義者許可權模型 956
24.4.2 調用者許可權模式 960
24.4.3 組合許可權模型 962
24.5 條件編譯 963
24.5.1 條件編譯的例子 964
24.5.2 查詢指令 965
24.5.3 $IF指令 968
24.5.4 $ERROR指令 970
24.5.5 把代碼和包常量同步 970
24.5.6 用查詢指令實現程式專有設定 971
24.5.7 使用預處理後的代碼 972
24.6 PL/SQL和資料庫實例記憶體 974
24.6.1 PGA、UGA和CGA 974
24.6.2 游標、記憶體及其他 975
24.6.3 減少記憶體用的技巧 977
24.6.4 如果記憶體用光了該怎么辦 987
24.7 原生式編譯 990
24.7.1 什麼時候使用解釋模式 990
24.7.2 什麼時候使用原生模式 991
24.7.3 原生編譯和資料庫版本 991
24.8 我們需要知道的 991
第25章 PL/SQL的全球化和本地化 993
25.1 概述和術語 995
25.2 Unicode入門 996
25.2.1 國家字元集的數據類型 998
25.2.2 字元編碼 998
25.2.3 和全球化支持相關的參數 999
25.2.4 Unicode 函式 1000
25.3 字元語義 1007
25.4 字元串排序順序 1011
25.4.1 二進制排序 1012
25.4.2 單語言排序 1013
25.4.3 多語言排序 1015
25.5 多語言信息檢索 1016
25.5.1 信息檢索和PL/SQL 1018
25.6 日期/時間 1021
25.6.1 時間戳數據類型 1021
25.6.2 日期/時間格式 1022
25.7 貨幣轉換 1026
25.8 PL/SQL的全球化開發工具箱 1028
25.8.1 UTL_I18N工具包 1028
25.8.2 UTL_LMS異常處理包 1031
25.8.3 GDK實現選項 1032
第26章 PL/SQL的面向對象特性 1034
26.1 Oracle對象特性的介紹 1034
26.2 對象類型示例 1036
26.2.1 創建一個基類 1037
26.2.2 創建子類型 1039
26.2.3 方法 1040
26.2.4 在Oracle資料庫11g中調用父類的方法 1045
26.2.5 保存、提取、使用持久化對象 1046
26.2.6 演變和創建 1054
26.2.7 回到指針嗎? 1056
26.2.8 泛化數據:ANY類型 1063
26.2.9 我也可以自己做 1067
26.2.10 對象的比較 1071
26.3 對象視圖 1075
26.3.1 一個示例的關係系統 1077
26.3.2 帶有集合屬性的對象視圖 1078
26.3.3 對象子視圖 1081
26.3.4 帶有反關係的對象視圖 1083
26.3.5 INSTEAD OF觸發器 1084
26.3.6 對象視圖和對象表的區別 1086
26.4 維護對象類型和對象視圖 1087
26.4.1 數據字典 1087
26.4.2 許可權 1089
26.5 來自一個關係開發者的總結思考 1091
附錄A 正則表達式的元字元和函式參數 1093
A.1 元字元 1093
A.2 函式和參數 1096
A.2.1 正則表達式函式 1096
A.2.2 正則表達式參數 1097
附錄B 數字格式模型 1099
附錄C 日期格式模型 1102