第5部分 构造PL/SQL应用程序 543
第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数据库11gR2版本) 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主题 887
第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