第5部分 构造PL/SQL应用程序 497
第17章 过程、函数和参数 497
17.1代码模块化 497
17.2过程 499
17.2.1调用一个过程 501
17.2.2过程头部 501
17.2.3过程体 501
17.2.4 END标签 502
17.2.5 RETURN语句 502
17.3函数 502
17.3.1函数的结构 503
17.3.2返回的数据类型 504
17.3.3 END标签 506
17.3.4调用函数 506
17.3.5不带参数的函数 507
17.3.6函数头 508
17.3.7函数体 508
17.3.8 RETURN语句 509
17.4参数 510
17.4.1定义参数 511
17.4.2实参和形参 511
17.4.3参数模式 512
17.4.4在PL/SQL中显式地关联实参和形参 515
17.4.5 NOCOPY参数模式限定符 519
17.4.6缺省值 519
17.5局部或者嵌套模块 520
17.5.1使用局部模块的益处 521
17.5.2局部模块的作用范围 523
17.5.3用局部模块使得代码更整洁 524
17.6模块的重载 524
17.6.1重载的益处 525
17.6.2重载的限制 528
17.6.3数字类型的重载 528
17.7前置声明 529
17.8高级主题 530
17.8.1在SQL内部调用我们的函数 530
17.8.2表函数 536
17.8.3确定性函数 545
17.8.4隐式游标结果(Oracle数据库12c) 546
17.9将模块化进行到底 547
第18章 程序包 548
18.1为什么使用程序包 548
18.1.1演示程序包的能力 549
18.1.2与程序包相关的一些概念 552
18.1.3图示私有性 553
18.2构建程序包的规则 554
18.2.1程序包说明 554
18.2.2包体 555
18.2.3包的初始化 557
18.3包元素的调用规则 561
18.4使用包数据 562
18.4.1在一个Oracle会话内全局可见 562
18.4.2全局公有数据 563
18.4.3包游标 563
18.4.4包的串行化 568
18.5何时使用包 570
18.5.1封装对数据的访问 570
18.5.2避免直接量的硬编码 573
18.5.3提高内置特性的可用性 575
18.5.4把逻辑上相关的功能组织在一起 576
18.5.5缓存静态的会话数据 576
18.6包和对象类型 577
第19章 触发器 578
19.1 DML触发器 579
19.1.1 DML触发器的概念 580
19.1.2创建DML触发器 581
19.1.3 DML触发器的例子:严禁作弊! 586
19.1.4同一类型的多个触发器 591
19.1.5如何对触发顺序排序 592
19.1.6突变表的错误 594
19.1.7复合触发器:聚在一处 595
19.2 DDL触发器 598
19.2.1创建DDL触发器 598
19.2.2可用事件 600
19.2.3可用属性 601
19.2.4使用事件和属性 602
19.2.5删除不可删除的 606
19.2.6 INSTEAD OFCREATE触发器 606
19.3数据库事件触发器 607
19.3.1创建数据库事件触发器 608
19.3.2 STARTUP触发器 609
19.3.3 SHUTDOWN触发器 610
19.3.4 LOGON触发器 610
19.3.5 LOGOFF触发器 610
19.3.6 SERVERERROR触发器 611
19.4 INSTEAD OF触发器 615
19.4.1创建INSTEAD OF触发器 615
19.4.2 INSTEAD OF INSERT触发器 616
19.4.3 INSTEAD OF UPDATE触发器 618
19.4.4 INSTEAD OF DELETE触发器 619
19.4.5填充表 619
19.4.6嵌套表的INSTEAD OF触发器 620
19.5 AFTER SUSPEND触发器 621
19.5.1建立AFTER SUSPEND触发器 622
19.5.2看看真实的触发器 623
19.5.3 ORA SPACE ERROR INFO函数 624
19.5.4 DBMS RESUMABLE包 625
19.5.5捕获多个时间 626
19.5.6是否该处理? 627
19.6维护触发器 628
19.6.1禁用、启用以及删除触发器 628
19.6.2创建一个禁用的触发器 628
19.6.3查看触发器 629
19.6.4检查触发器的有效性 630
第20章 管理PL/SQL代码 631
20.1管理数据库内的代码 632
20.1.1数据字典视图概述 632
20.1.2显示存储对象的信息 634
20.1.3源代码的显示和搜索 635
20.1.4根据程序的大小确定Pinning需求 637
20.1.5获得存储代码的属性 637
20.1.6通过视图分析和更改触发器状态 638
20.1.7分析参数信息 639
20.1.8分析标识符的使用(Oracle数据库11g的PL/Scope) 640
20.2管理依赖关系及重编译代码 643
20.2.1通过数据字典视图分析依赖关系 643
20.2.2细粒度依赖(Oracle数据库11g) 647
20.2.3远程依赖 648
20.2.4 Oracle的远程调用模式的限制 650
20.2.5重编译无效的程序单元 651
20.3编译时刻警告 655
20.3.1一个快速示例 655
20.3.2开启编译时刻告警 656
20.3.3一些有用的警告 657
20.4测试PL/SQL程序 664
20.4.1典型的、华而不实的测试技术 665
20.4.2 PL/SQL代码测试的一般建议 668
20.4.3 PL/SQL的自动测试选项 669
20.5跟踪PL/SQL的执行 670
20.5.1 DBMS UTILITY.FORMATCALL STACK 671
20.5.2 UTL CALL STACK(Oracle数据库12c) 673
20.5.3 DBMS APPLICATION INFO 676
20.5.4使用opp_ trace进行跟踪 677
20.5.5 DBMS TRACE工具包 678
20.6 PL/SQL程序的调试 681
20.6.1错误的调试方法 682
20.6.2调试技巧和策略 683
20.7使用白名单来控制对程序单元的访问 687
20.8存储代码的保护 689
20.8.1封装的约束和局限 690
20.8.2使用封装程序 690
20.8.3使用DBMS DDL进行动态封装 690
20.8.4封装代码的使用指导 691
20.9基于版本的重定义(Oracle数据库11 g R2版本) 692
第21章PL/SQL的性能优化 695
21.1辅助优化的工具 696
21.1.1内存使用分析 696
21.1.2发现PL/SQL代码中的瓶颈 697
21.1.3计算花费时间 701
21.1.4选择最快的程序 703
21.1.5避免无限循环 704
21.1.6性能相关的警告 706
21.2优化编译器 706
21.2.1优化器工作原理 707
21.2.2循环Fetch操作的运行时优化 710
21.3数据缓存技术 710
21.3.1基于包的缓存 711
21.3.2确定性函数的缓存 716
21.3.3函数结果缓存(Oracle数据库11g) 718
21.3.4缓存总结 731
21.4重复的SQL的语句批处理 732
21.4.1通过BULK COLLECT加速查询 733
21.4.2使用FORALL加速DML 739
21.5利用管道化的表函数提升性能 749
21.5.1用基于管道化函数的加载方式替换基于行的插入 750
21.5.2用管道函数调优Merge操作 756
21.5.3用并行管道函数进行异步数据导出 758
21.5.4并行管道函数中的分区和流子句对性能的影响 761
21.5.5管道函数和基于成本的优化器 763
21.5.6用管道函数优化负载的数据加载 768
21.5.7管道函数结束语 775
21.6专用的优化技术 775
21.6.1使用NOCOPY参数模式提示符 775
21.6.2使用正确的数据类型 778
21.6.3 SQL(12.1及更高版本)的函数性能优化 779
21.7性能回顾 780
第22章I/O操作和PL/SQL 781
22.1显示信息 781
22.1.1启用DBMS OUTPUT 782
22.1.2向缓存中写入行 782
22.1.3从缓存中读取内容 783
22.2文件的读写 784
22.2.1 UTL_ FILE_ DIR参数 784
22.2.2使用Oracle目录 786
22.2.3打开文件 787
22.2.4文件已经打开了吗? 789
22.2.5关闭文件 789
22.2.6读取文件 790
22.2.7向文件中写 792
22.2.8复制文件 795
22.2.9删除文件 795
22.2.10改名和移动文件 796
22.2.11提取文件属性 797
22.3发送邮件 798
22.3.1 Oracle的前提条件 798
22.3.2设置网络安全 799
22.3.3发送一个短的(小于32767字节)的纯文本消息 799
22.3.4在邮件地址中加上“界面友好的”的名字 801
22.3.5发送任意长度的纯文本消息 802
22.3.6发送带有小附件(小于32767字节)的消息 803
22.3.7以附件形式发送一个小文件(小于32767字节) 805
22.3.8任意大小的附件 805
22.4使用基于Web的数据 (HTTP ) 808
22.4.1“分片”获得一个Web页面 808
22.4.2把页面提取到一个LOB中 809
22.4.3使用HTTP的用户名/密码验证 810
22.4.4获取一个SSL加密的Web页面(使用HTTPS) 811
22.4.5通过GET或者POST向Web页面提交数据 812
22.4.6禁用cookie或者使cookie持久化 816
22.4.7从FTP服务器获取数据 816
22.4.8使用代理服务器 817
22.5 PL/SQL中可用的其他I/O类型 817
22.5.1数据库管道、队列、告警 817
22.5.2 TCPSocket 818
22.5.3 Oracle的内置Web服务器 818
第6部分 高级PL/SQL主题 821
第23章 应用系统安全与PL/SQL 821
23.1安全概述 821
23.2加密 822
23.2.1密钥长度 823
23.2.2算法 824
23.2.3填补和连接 825
23.2.4 DBMS CRYPTO包 825
23.2.5数据加密 827
23.2.6 LOB的加密 830
23.2.7安全文件 830
23.2.8数据解密 831
23.2.9生成密钥 832
23.2.10密钥的管理 833
23.2.11加密哈希 838
23.2.12使用消息验证码 839
23.2.13使用透明数据加密(TDE) 841
23.2.14透明的表空间加密 843
23.3行级安全 844
23.3.1为什么要学习RLS 846
23.3.2一个简单的RLS示例 847
23.3.3静态与动态策略 850
23.3.4使用列敏感的RLS 854
23.3.5 RLS调试 857
23.4应用程序上下文 861
23.4.1使用应用程序上下文 862
23.4.2上下文的安全 863
23.4.3把上下文用作RLS的谓词条件 863
23.4.4识别出非数据库的用户 867
23.5细粒度审计 868
23.5.1为什么要学习FGA 869
23.5.2一个简单的FGA示例 870
23.5.3访问多少列 872
23.5.4查看审计跟踪信息 873
23.5.5使用绑定变量 874
23.5.6使用句柄模块 875
第24章PL/SQL架构 877
24.1 DIANA 877
24.2 Oracle如何执行PL/SQL代码 878
24.2.1一个示例 879
24.2.2编译器的限制 881
24.3 PL/SQL的缺省包 882
24.4执行权限模型 884
24.4.1定义者权限模型 885
24.4.2调用者权限模型 889
24.4.3组合权限模型 891
24.4.4给PL/SQL程序单元授予角色 (Oracle数据库12c) 892
24.4.5“谁调用了我?”函数 (Oracle数据库12c) 895
24.4.6视图的BEQUEATH CURRENT USER子句(Oracle数据库12c) 895
24.4.7调用者权限优点的限制 (Oracle数据库12c) 897
24.5条件编译 898
24.5.1条件编译的示例 899
24.5.2查询指令 900
24.5.3 $IF指令 903
24.5.4 $ERROR指令 904
24.5.5将代码与包常量同步 905
24.5.6用查询指令实现程序专有设置 906
24.5.7使用预处理后的代码 907
24.6 PL/SQL和数据库实例内存 908
24.6.1 SGA、 PGA和UGA 908
24.6.2游标、内存及其他 909
24.6.3减少内存使用的技巧 910
24.6.4内存用光了怎么办 920
24.7原生式编译 922
24.7.1什么时候使用解释模式 922
24.7.2什么时候使用原生模式 922
24.7.3原生编译和数据库版本 923
24.8一些须知 923
第25章PL/SQL的全球化和本地化 925
25.1概述和术语 926
25.2 Unicode入门 928
25.2.1国家字符集的数据类型 929
25.2.2字符编码 929
25.2.3和全球化支持相关的参数 930
25.2.4 Unicode函数 931
25.3字符语义 938
25.4字符串排序顺序 941
25.4.1二进制排序 942
25.4.2单语言排序 943
25.4.3多语言排序 945
25.5多语言信息检索 946
25.5.1信息检索和PL/SQL 948
25.6日期/时间 950
25.6.1时间戳数据类型 951
25.6.2日期/时间格式 952
25.7货币转换 955
25.8 PL/SQL的全球化开发工具箱 957
25.8.1 UTL_ I18N工具包 957
25.8.2 UTL_LMS异常处理包 960
25.8.3 GDK实现选项 961
第26章PL/SQL的面向对象特性 963
26.1 Oracle对象特性的介绍 963
26.2对象类型示例 965
26.2.1创建一个基类 966
26.2.2创建子类型 967
26.2.3方法 968
26.2.4在Oracle数据库11g及以后版本中调用父类的方法 972
26.2.5保存、提取、使用持久化对象 974
26.2.6演变和创建 981
26.2.7回到指针吗? 983
26.2.8泛化数据:ANY类型 989
26.2.9我们自己做 993
26.2.10对象的比较 996
26.3对象视图 1001
26.3.1一个关系型系统的示例 1002
26.3.2带有集合属性的对象视图 1003
26.3.3对象子视图 1006
26.3.4带有反关系的对象视图 1008
26.3.5 INSTEAD OF触发器 1008
26.3.6对象视图和对象表的区别 1010
26.4维护对象类型和对象视图 1012
26.4.1数据字典 1012
26.4.2权限 1013
26.5来自一个关系开发者的总结思考(C551, E1200) 1015
第27章 从PL/SQL中调用Java 1017
27.1 Oracle和Java 1017
27.2准备好在Oracle中使用Java 1018
27.2.1安装Java 1019
27.2.2创建和编译我们的Java代码 1019
27.2.3设置Java开发和执行的权限 1020
27.3一个简单的演示 1022
27.3.1查找Java功能 1023
27.3.2创建一个自定义Java类 1023
27.3.3编译和加载到Oracle 1025
27.3.4创建一个PL/SQL的包装器 1026
27.3.5从PL/SQL删除文件 1027
27.4使用loadjava 1028
27.5使用dropj ava 1030
27.6管理数据库中的Java 1030
27.6.1 Oracle中的Java命名空间 1030
27.6.2检查加载的Java元素 1031
27.7使用DBMS_JAVA 1032
27.7.1 LONGNAME:转换Java长名字 1032
27.7.2 GET、 SET_和RESET COMPILER OPTION:得到和设置(一些)编译器选项 1033
27.7.3 SET OUTPUT:允许从Java中输出 1034
27.7.4 EXPORT SOURCE、 EXPORT_RESOURCE和EXPORT_CLASS:导出模式对象 1034
27.8在PL/SQL中发布与使用Java 1036
27.8.1调用规范 1036
27.8.2一些调用规范的规则 1037
27.8.3映射数据类型 1038
27.8.4在SQL中调用Java方法 1039
27.8.5 Java的异常处理 1040
27.8.6扩展文件I/O功能 1042
27.8.7其他示例 1046
第28章 外部过程 1049
28.1外部过程介绍 1050
28.1.1示例:调用一个系统命令 1050
28.1.2外部过程的架构 1052
28.2 Oracle网络配置 1053
28.2.1定义监听配置 1053
28.2.2配置的安全特性 1055
28.3设置多线程模式 1056
28.4创建一个Oracle库 1058
28.5编写调用规范 1059
28.5.1调用规范:整体语法 1060
28.5.2参数映射:示例重温 1061
28.5.3参数映射:完整的内容 1063
28.5.4更多的语法:参数子句 1064
28.5.5参数属性 1065
28.6从调用的C程序中引发一个异常 1068
28.7非默认的代理 1071
28.8维护外部过程 1073
28.8.1删除库 1073
28.8.2数据字典 1074
28.8.3规则和警示 1074
附录A正则表达式元字符和函数参数 1075
附录B数字格式模型 1080
附录C日期格式模型 1083