港澳台地道味 · 食出新意思
餅乾 糕點 甜點
鳳梨酥 麻薯 沙琪瑪
蛋糕 麵包 派 銅鑼燒
餅乾 脆棒 烤饃片 酥餅
休閒 膨化 洋芋片
膨化 薯片 蝦條 點心 米果
威化 蛋捲 麻花 鍋巴
網紅零食
童年同款辣條 日韩便利店必買 茶顏悅色·超全到貨 機場限定伴手禮 春季多巴胺 抹茶限定
方便速食 泡麵 自熱火鍋
泡麵 拉麵 杯麵 即食年糕
自熱火鍋 冒菜 麻辣燙 烤冷麵
螺螄粉 方便粉絲 酸辣粉 涼皮
即食飯 八寶粥 滷蛋 代餐
八寶粥 代餐 米稀 即食甜點
拌飯 即食飯 即食粥 即食湯
醬菜 鹹菜 拌飯醬 老乾媽
開袋即食 滷蛋 罐頭
火鍋底料 廚房調味
火鍋底料
沾醬 花生醬 麻醬
乾鍋料 水煮魚 料包
湯料 鹵料包
醬油 醬汁 蠔油
白醋陳醋
辣椒醬/粉 豆瓣醬
料酒 香油 香辛大料
鹽/糖 冰糖 紅糖
調味醬 調味料 燒烤醬
沙拉醬 番茄醬 咖哩
糧油米麵 副食乾貨
米粉/線 麵條 粉絲
米 糯米 糙米
五穀雜糧 豆子
麵粉 麵點 預拌粉
食用油 橄欖油
豆皮 紫菜 海帶結 乾菜
莧皮 鴨血 豆腐 火鍋涮菜
大棗 銀耳 蓮子 枸杞
木耳 菌菇
海產 臘肉 醃味
歷史瀏覽

京東圖書
Oracle PL/SQL实例精解(原书第5版)
商品描述
展開全部描述
Content Description
本书通过实际的实验、示例和项目来讲解你所需的全部PL/SQL技能,它涵盖从基础语法、程序控制到新的优化和安全增强等方面的知识。读者循序渐进地学习每个关键任务,自己就能掌握当今有价值的Oracle12c的PL/SQL编程技术。本书的方法完全反映了作者在哥伦比亚大学给专业人员讲授PL/SQL的广受好评的经验。数据库开发的新手和DBA可以通过学习本书快速获得成效。有经验的PL/SQL程序员会发现本书是很好的Oracle12c的解决方案参考。
Author Description
About the AuthorBenjamin Rosenzweig,是Misys财务软件公司的高级项目经理,他自2002年以来一直在那里工作。在此之前,他曾在Oracle公司定制开发部担任了三年以上的首席顾问。他所做的计算机工作包括在尼泊尔加德满都建立电子藏英词典,为高盛公司演示中心做支持,以及管理TIAA-CREF的交易系统。自1998年以来,Benjamin一直在纽约市哥伦比亚大学计算机技术与应用项目担任教师,在2002年,他被CTA项目的主席和董事授予“优秀教学奖”。他拥有里德学院的学士学位和哥伦比亚大学颁发的数据库开发和设计证书。他从前与Prentice Hall合著的书籍包括《Oracle Forms Developer:The Complete Video Course (2000)》和《Oracle Web Application Programming for PL/SQL Developers(2003)》。
Elena Rakhimov,拥有超过20年的数据库架构和开发经验,曾服务于各种企业和商业环境,从非营利组织到华尔街到她目前在知名软件公司领导数据库团队的职位。尽管Elena决定从事“实际操作”,但她在学术领域也很有建树,她在哥伦比亚大学受到高度评价的计算机技术与应用项目中执教关系数据库编程。她曾在哥伦比亚大学学习数据库分析和设计,并在阿塞拜疆的巴库国立大学学习应用数学。她目前居住在加拿大温哥华。
Catalogue
译者序
前言
作者简介
致谢
第1章PL/SQL概念 1
1.1实验1:PL/SQL架构 1使用 8
1.2.2初步掌握SQL * Plus的使用 10
1.2.3执行PL/SQL脚本 11
1.3实验3:PL/SQL基础知识 14
1.3.1DBMS_OUTPUT.PUT_LINE语句 14
1.3.2替代变量功能 17
1.4总结 21
第2章PL/SQL语言基础 22
2.1实验:PL/SQL编程基础 22
2.1.1PL/SQL语言组件 23
2.1.2PL/SQL变量 23
2.1.3PL/SQL保留字 26
2.1.4PL/SQL中的标识符 26
2.1.5挂靠的数据类型 27
2.1.6声明和初始化变量 29
2.1.7块作用域、嵌套块和标签 32
2.2总结 34
第3章在PL/SQL中的SQL 35
3.1实验1:在PL/SQL中的DML
语句 35
3.1.1使用SELECT INTO初始化变量 36
3.1.2使用变量初始化的SELECT INTO语法 37
3.1.3在PL/SQL块中使用DML 38
3.1.4在PL/SQL块中使用序列 39
3.2实验2:在PL/SQL中的事务控制 40
3.2.1使用COMMIT、ROLLBACK和
SAVEPOINT 40
3.2.2将DML和事务控制相结合 43
3.3总结 45
第4章条件控制:IF语句 46
4.1实验1:IF语句 46
4.1.1IF-THEN语句 47
4.1.2IF-THEN-ELSE语句 48
4.2实验2:ELSIF语句 50
4.3实验3:嵌套的IF语句 54
4.4总结 56
第5章条件控制:CASE语句 57
5.1实验1:CASE语句 57
5.1.1CASE语句 57
5.1.2搜索CASE语句 59
5.2实验2:CASE表达式 64
5.3实验3:NULLIF和COALESCE
函数 67
5.3.1NULLIF函数 67
5.3.2COALESCE函数 69
5.4总结 71
第6章迭代控制:第一部分 72
6.1实验1:简单循环 72
6.1.1EXIT语句 73
6.1.2EXIT WHEN语句 76
6.2实验2:WHILE循环 77
6.2.1使用WHILE循环 77
6.2.2提前终止WHILE循环 80
6.3实验3:数字FOR循环 81
6.3.1在循环中使用IN选项 82
6.3.2在循环中使用REVERSE选项 84
6.3.3提前终止数字FOR循环 84
6.4总结 85
第7章迭代控制:第二部分 86
7.1实验1:CONTINUE语句 86
7.1.1使用CONTINUE语句 86
7.1.2CONTINUE WHEN语句 89
7.2实验2:嵌套循环 92
7.2.1使用嵌套循环 92
7.2.2使用循环标签 93
7.3总结 95
第8章错误处理和内置异常 96
8.1实验1:处理错误 96
8.2实验2:内置异常 98
8.3总结 103
第9章异常 104
9.1实验1:异常作用域 104
9.2实验2:用户定义的异常 107
9.3实验3:异常传播 111
9.4总结 116
第10章异常:高级概念 117
10.1实验1:RAISE_APPLICATION
ERROR 117
10.2实验2:EXCEPTION_INIT
编译指示 120
10.3实验3:SQLCODE和
SQLERRM 122
10.4总结 124
第11章游标简介 125
11.1实验1:游标类型 125
11.1.1使用隐式游标 126
11.1.2使用显式游标 127
11.2实验2:游标循环 130
11.2.1处理显式游标 130
11.2.2使用用户定义的记录 133
11.2.3使用游标属性 134
11.3实验3:游标FOR循环 138
11.4实验4:嵌套游标 139
11.5总结 143
第12章高级游标 144
12.1实验1:参数化游标 144
12.2实验2:复杂的嵌套游标 145
12.3实验3:FOR UPDATE和WHERE CURRENT游标 147
12.3.1FOR UPDATE游标 147
12.3.2游标中的FOR UPDATE 触发器 151
13.1.1数据库触发器 151
13.1.2BEFORE触发器 154
13.1.3AFTER触发器 159
13.1.4自治事务 160
13.2实验2:触发器类型 162
13.2.1行触发器和语句触发器 162
13.2.2INSTEAD OF触发器 163
13.3总结 167
第14章变异表和复合触发器 168
14.1实验1:变异表 168
14.1.1什么是变异表 168
14.1.2解决变异表问题 170
14.2实验2:复合触发器 172
14.2.1什么是复合触发器 172
14.2.2解决变异表问题的复合
触发器 174
14.3总结 177
第15章集合 178
15.1实验1:PL/SQL表 178
15.1.1关联数组 179
15.1.2嵌套表 181
15.1.3集合方法 184
15.2实验2:变长数组 187
15.3实验3:多级集合 190
15.4总结 192
第16章记录 193
16.1实验1:记录类型 193
16.1.1基于表和基于游标的记录 194
16.1.2用户定义的记录 196
16.1.3记录兼容性 197
16.2实验2:嵌套记录 199
16.3实验3:记录集合 202
16.4总结 205
第17章本地动态SQL 206
17.1实验1:EXECUTE IMMEDIATE语句 206
17.1.1使用EXECUTE IMMEDIATE
语句 207
17.1.2如何避免使用EXECUTE
IMMEDIATE的常见ORA错误 209
17.2实验2:OPEN-FOR、FETCH和
CLOSE语句 216
17.2.1打开游标 216
17.2.2从游标中读取 217
17.2.3关闭游标 217
17.3总结 223
第18章批量SQL 224
18.1实验1:FORALL语句 224
18.1.1使用FORALL语句 225
18.1.2SAVE EXCEPTIONS选项 228
18.1.3INDICES OF选项 230
18.1.4VALUES OF选项 230
18.2实验2:BULK COLLECT子句 232
18.3实验3:在SQL语句中绑定集合 239
18.3.1将集合与EXECUTE IMMEDIATE语句绑定 240
18.3.2将集合与OPEN-FOR、FETCH和CLOSE语句绑定 245
18.4总结 248
第19章过程 249
19.1模块化代码的好处 249
19.1.1块结构 250
19.1.2匿名块 250
19.2实验1:创建过程 250
19.2.1实践创建过程的语法 251
19.2.2查询数据字典来获取过程的
信息 252
19.3实验2:传递的过程参数IN和
OUT 253
19.4总结 255
第20章函数 256
20.1实验1:创建函数 256
20.1.1创建存储函数 257
20.1.2使用函数 259
20.2实验2:在SQL语句中使用函数 260
20.2.1在SQL语句中调用函数 261
20.2.2编写复杂函数 261
20.3实验3:在SQL中优化函数执行 262
20.3.1使用WITH子句定义函数 262
20.3.2使用UDF编译指示创建函数 263
20.4总结 263
第21章包 264
21.1实验1:创建包 264
21.1.1创建包规范 265
21.1.2创建包体 267
21.1.3调用已存储的包 269
21.1.4创建私有对象 270
21.2实验2:游标变量 274
21.3实验3:扩展包 281
21.4实验4:包的实例化和初始化 292
21.5实验5:SERIALLY_REUSABLE包 294
21.6总结 296
第22章存储代码 297
22.1实验:收集存储代码的相关信息 297
22.1.1从数据字典获取存储代码的信息 297
22.1.2重载模块 300
22.2总结 305
第23章Oracle对象类型 306
23.1实验1:对象类型 306
23.1.1创建对象类型 308
23.1.2使用对象类型与集合 310
23.2实验2:对象类型的方法 314
23.2.1构造方法 314
23.2.2成员方法 316
23.2.3静态方法 317
23.2.4比较对象 318
23.3总结 322
第24章Oracle提供的包 323
24.1实验1:利用Oracle提供的包扩展功能 323
24.1.1在PL/SQL中利用UTL_FILE访问文件 324
24.1.2利用DBMS_JOB调度作业 327
24.1.3利用DBMS_XPLAN生成解释计划 329
24.1.4利用DBMS_SQL产生隐式语句结果 333
24.2实验2:利用Oracle提供的包报告错误 334
24.2.1利用DBMS_UTILITY包报告错误 334
24.2.2利用UTL_CALL_STACK
前言
作者简介
致谢
第1章PL/SQL概念 1
1.1实验1:PL/SQL架构 1使用 8
1.2.2初步掌握SQL * Plus的使用 10
1.2.3执行PL/SQL脚本 11
1.3实验3:PL/SQL基础知识 14
1.3.1DBMS_OUTPUT.PUT_LINE语句 14
1.3.2替代变量功能 17
1.4总结 21
第2章PL/SQL语言基础 22
2.1实验:PL/SQL编程基础 22
2.1.1PL/SQL语言组件 23
2.1.2PL/SQL变量 23
2.1.3PL/SQL保留字 26
2.1.4PL/SQL中的标识符 26
2.1.5挂靠的数据类型 27
2.1.6声明和初始化变量 29
2.1.7块作用域、嵌套块和标签 32
2.2总结 34
第3章在PL/SQL中的SQL 35
3.1实验1:在PL/SQL中的DML
语句 35
3.1.1使用SELECT INTO初始化变量 36
3.1.2使用变量初始化的SELECT INTO语法 37
3.1.3在PL/SQL块中使用DML 38
3.1.4在PL/SQL块中使用序列 39
3.2实验2:在PL/SQL中的事务控制 40
3.2.1使用COMMIT、ROLLBACK和
SAVEPOINT 40
3.2.2将DML和事务控制相结合 43
3.3总结 45
第4章条件控制:IF语句 46
4.1实验1:IF语句 46
4.1.1IF-THEN语句 47
4.1.2IF-THEN-ELSE语句 48
4.2实验2:ELSIF语句 50
4.3实验3:嵌套的IF语句 54
4.4总结 56
第5章条件控制:CASE语句 57
5.1实验1:CASE语句 57
5.1.1CASE语句 57
5.1.2搜索CASE语句 59
5.2实验2:CASE表达式 64
5.3实验3:NULLIF和COALESCE
函数 67
5.3.1NULLIF函数 67
5.3.2COALESCE函数 69
5.4总结 71
第6章迭代控制:第一部分 72
6.1实验1:简单循环 72
6.1.1EXIT语句 73
6.1.2EXIT WHEN语句 76
6.2实验2:WHILE循环 77
6.2.1使用WHILE循环 77
6.2.2提前终止WHILE循环 80
6.3实验3:数字FOR循环 81
6.3.1在循环中使用IN选项 82
6.3.2在循环中使用REVERSE选项 84
6.3.3提前终止数字FOR循环 84
6.4总结 85
第7章迭代控制:第二部分 86
7.1实验1:CONTINUE语句 86
7.1.1使用CONTINUE语句 86
7.1.2CONTINUE WHEN语句 89
7.2实验2:嵌套循环 92
7.2.1使用嵌套循环 92
7.2.2使用循环标签 93
7.3总结 95
第8章错误处理和内置异常 96
8.1实验1:处理错误 96
8.2实验2:内置异常 98
8.3总结 103
第9章异常 104
9.1实验1:异常作用域 104
9.2实验2:用户定义的异常 107
9.3实验3:异常传播 111
9.4总结 116
第10章异常:高级概念 117
10.1实验1:RAISE_APPLICATION
ERROR 117
10.2实验2:EXCEPTION_INIT
编译指示 120
10.3实验3:SQLCODE和
SQLERRM 122
10.4总结 124
第11章游标简介 125
11.1实验1:游标类型 125
11.1.1使用隐式游标 126
11.1.2使用显式游标 127
11.2实验2:游标循环 130
11.2.1处理显式游标 130
11.2.2使用用户定义的记录 133
11.2.3使用游标属性 134
11.3实验3:游标FOR循环 138
11.4实验4:嵌套游标 139
11.5总结 143
第12章高级游标 144
12.1实验1:参数化游标 144
12.2实验2:复杂的嵌套游标 145
12.3实验3:FOR UPDATE和WHERE CURRENT游标 147
12.3.1FOR UPDATE游标 147
12.3.2游标中的FOR UPDATE 触发器 151
13.1.1数据库触发器 151
13.1.2BEFORE触发器 154
13.1.3AFTER触发器 159
13.1.4自治事务 160
13.2实验2:触发器类型 162
13.2.1行触发器和语句触发器 162
13.2.2INSTEAD OF触发器 163
13.3总结 167
第14章变异表和复合触发器 168
14.1实验1:变异表 168
14.1.1什么是变异表 168
14.1.2解决变异表问题 170
14.2实验2:复合触发器 172
14.2.1什么是复合触发器 172
14.2.2解决变异表问题的复合
触发器 174
14.3总结 177
第15章集合 178
15.1实验1:PL/SQL表 178
15.1.1关联数组 179
15.1.2嵌套表 181
15.1.3集合方法 184
15.2实验2:变长数组 187
15.3实验3:多级集合 190
15.4总结 192
第16章记录 193
16.1实验1:记录类型 193
16.1.1基于表和基于游标的记录 194
16.1.2用户定义的记录 196
16.1.3记录兼容性 197
16.2实验2:嵌套记录 199
16.3实验3:记录集合 202
16.4总结 205
第17章本地动态SQL 206
17.1实验1:EXECUTE IMMEDIATE语句 206
17.1.1使用EXECUTE IMMEDIATE
语句 207
17.1.2如何避免使用EXECUTE
IMMEDIATE的常见ORA错误 209
17.2实验2:OPEN-FOR、FETCH和
CLOSE语句 216
17.2.1打开游标 216
17.2.2从游标中读取 217
17.2.3关闭游标 217
17.3总结 223
第18章批量SQL 224
18.1实验1:FORALL语句 224
18.1.1使用FORALL语句 225
18.1.2SAVE EXCEPTIONS选项 228
18.1.3INDICES OF选项 230
18.1.4VALUES OF选项 230
18.2实验2:BULK COLLECT子句 232
18.3实验3:在SQL语句中绑定集合 239
18.3.1将集合与EXECUTE IMMEDIATE语句绑定 240
18.3.2将集合与OPEN-FOR、FETCH和CLOSE语句绑定 245
18.4总结 248
第19章过程 249
19.1模块化代码的好处 249
19.1.1块结构 250
19.1.2匿名块 250
19.2实验1:创建过程 250
19.2.1实践创建过程的语法 251
19.2.2查询数据字典来获取过程的
信息 252
19.3实验2:传递的过程参数IN和
OUT 253
19.4总结 255
第20章函数 256
20.1实验1:创建函数 256
20.1.1创建存储函数 257
20.1.2使用函数 259
20.2实验2:在SQL语句中使用函数 260
20.2.1在SQL语句中调用函数 261
20.2.2编写复杂函数 261
20.3实验3:在SQL中优化函数执行 262
20.3.1使用WITH子句定义函数 262
20.3.2使用UDF编译指示创建函数 263
20.4总结 263
第21章包 264
21.1实验1:创建包 264
21.1.1创建包规范 265
21.1.2创建包体 267
21.1.3调用已存储的包 269
21.1.4创建私有对象 270
21.2实验2:游标变量 274
21.3实验3:扩展包 281
21.4实验4:包的实例化和初始化 292
21.5实验5:SERIALLY_REUSABLE包 294
21.6总结 296
第22章存储代码 297
22.1实验:收集存储代码的相关信息 297
22.1.1从数据字典获取存储代码的信息 297
22.1.2重载模块 300
22.2总结 305
第23章Oracle对象类型 306
23.1实验1:对象类型 306
23.1.1创建对象类型 308
23.1.2使用对象类型与集合 310
23.2实验2:对象类型的方法 314
23.2.1构造方法 314
23.2.2成员方法 316
23.2.3静态方法 317
23.2.4比较对象 318
23.3总结 322
第24章Oracle提供的包 323
24.1实验1:利用Oracle提供的包扩展功能 323
24.1.1在PL/SQL中利用UTL_FILE访问文件 324
24.1.2利用DBMS_JOB调度作业 327
24.1.3利用DBMS_XPLAN生成解释计划 329
24.1.4利用DBMS_SQL产生隐式语句结果 333
24.2实验2:利用Oracle提供的包报告错误 334
24.2.1利用DBMS_UTILITY包报告错误 334
24.2.2利用UTL_CALL_STACK
Introduction
本书用一种独特的风格介绍了Oracle的PL/SQL程序设计语言。它促使你通过使用Oracle PL/SQL,而不只是通过阅读来学习它。
正如语法手册通过首先展示名词和动词的示例,然后要求你写句子来讲解它们,本书也通过首先展示游标、循环、过程、触发器等的示例,要求你自己创建这些对象来讲解它们。
本书的目标读者本书是为那些需要快速地详细了解Oracle的PL/SQL语言编程的人员准备的。理想的读者是那些具有以下条件的人员:他们有某些关系数据库的经验,具有一定的Oracle经验,特别是SQL、SQL * Plus和SQL Developer,但对于PL/SQL或大多数其他编程语言只有很少的经验或根本没有经验。
本书的内容主要基于纽约市哥伦比亚大学计算机技术与应用(CTA)项目的PL/SQL导论课程教学素材。学生的层次是相当不同的,因为有一些学生具有多年的信息技术(IT)和编程经验,但没有Oracle PL/SQL方面的经验,还有一些学生则完全没有IT或编程经验。与这门课一样,本书内容兼顾了这两种极端的需求。配套网站上的补充练习可以作为讲解这样一门PL/SQL课程的配套实验和家庭作业。
本书的组织结构本书旨在首先通过解释编程概念或特定的PL/SQL功能,然后通过示例进一步说明它来教会你使用Oracle PL/SQL。通常情况下,当讨论更深入的主题时,这些示例将被修改,以说明新涉及的内容。此外,本书的大多数章节都具有可在配套网站获得的补充练习部分。这些练习可以帮助你测试对新内容的理解程度。
每章的基本结构都如下:
目标简介实验实验总结目标部分列出此章所包含的主题。基本上每个目标都对应于一个实验。
简介提供该章涉及的概念和功能的简要概述。
每个实验都涵盖了在该章的目标部分列出的一个目标。在一些情况下,在实验中,目标被进一步分解为更小的单个主题。然后每个这样的主题都借助示例和相应的输出来说明和展示。需要注意的是,每个示例都尽可能完整地提供,这使得其代码是现成可用的。
每章最后都有一个总结,它对此章讨论的内容进行了简要总结。此外,“顺便说说”部分会说明某个特定章节是否有配套网站上的补充练习。
关于配套网站配套网站位于informit.com/title/0133796787。你会在那里发现三项非常重要的内容:
创建和安装STUDENT模式所需要的文件。
包含本书各章使用的示例脚本的文件。
补充练习的章节,其中有两部分:
“问与答”部分,其中包含某个特定的章所介绍内容的相关问题,以及这些问题的参考答案。通常情况下,要求你基于一些需求修改一个脚本,并解释这些修改造成的输出差异。请注意,这部分也被组织成与书中的相应章节类似的实验。
“试一试”部分,要求你根据给定的需求来创建脚本。此部分与“问与答”部分不同,没有给这些问题提供任何脚本。相反,你需要自己创建全部脚本。
顺便说说如果想执行各章节和网站上提供的脚本,需要在使用本书之前访问配套网站,下载student模式,并将其安装在数据库中。
先决条件完成本书中的实验既需要有软件程序,也需要有必要的知识。需要注意的是,本书涉及的一些功能只适用于Oracle 12c。但是,只要利用下列产品,就能够运行绝大部分的示例并完成补充练习和“试一试”部分:
Oracle 11g或更高版本。
SQL Developer或SQL * Plus 11g或更高版本。
接入互联网。
你可以使用Oracle个人版或Oracle企业版来执行本书的示例。如果你使用Oracle企业版,则可以在一台远程服务器或自己的本地机器上运行。建议你使用Oracle 11g或Oracle 12c,以便执行本书全部或大部分的示例。当某个功能仅适用于Oracle数据库的最新版本时,本书会明确地说明。此外,你应该能够使用并熟悉SQL Developer或SQL * Plus。
关于如何在SQL Developer或SQL * Plus中编辑和运行脚本有许多选择。也有许多可用来编辑和调试PL/SQL代码的第三方程序。本书中同时采用了SQL Developer和SQL * Plus来说明,因为这两者都是Oracle提供的工具,并作为Oracle安装的一部分提供。
顺便说说第1章具有名为“PL/SQL开发环境”这样一个实验,它介绍了如何开始使用SQL Developer和SQL * Plus。然而,本书使用的绝大多数示例都在SQL Developer中执行。
关于示例模式STUDENT模式包含表和其他对象,用来保存一个虚构大学的注册和登记系统的相关信息。系统中有10个表,分别存储学生、课程、教师等的相关数据。除了存储学生和教师的联系信息(地址和电话号码),以及有关课程的描述性信息(费用和先决课程)之外,本模式还记录特定课程的课班(section),以及学生已经就读的课班。
SECTION表是在本模式中最重要的表之一,因为它存储有关已为每门课程创建的各个课班的数据。每个课班记录还存储此课班在哪里及何时上课,以及哪位教师会教授此课班的信息。SECTION表与COURSE和INSTRUCTOR表相关。
ENROLLMENT表是同样重要的,因为它记录哪些学生就读于哪些课班。每个入学记录还存储有关学生的成绩和注册日期信息。ENROLLMENT表与STUDENT和SECTION表相关。
STUDENT模式还有其他几个表来管理在每个课班中的每个学生的成绩。
STUDENT模式的详细结构参见附录B。
Oracle 12c PL/SQL新特性简介Oracle 12c已经为PL/SQL引入了许多新特性和改进。这里简要介绍了未在本书中讨论的特性,并指出了本书涉及的特性所在的具体章节。在作为Oracle联机帮助的一部分提供的《PL/SQL Language Reference》手册的“Changes in This Release for Oracle Database PL/SQL Language Reference”一节也可找到这里描述的特性清单。
PL/SQL的新特性和改进如下:
调用者权限函数可缓存结果。
PL/SQL独有的更多数据类型可以跨越PL/SQL到SQL的接口子句。
ACCESSIBLE BY子句。
FETCH FIRST子句。
可将角色授予PL/SQL包和独立子程序。
更多的数据类型在SQL和PL/SQL中具有相同的最大大小。
可插拔数据库上的数据库触发器。
LIBRARY可定义为DIRECTORY对象,并可带有CREDENTIAL子句。
隐式语句结果。
BEQUEATH CURRENT_USER视图。
INHERIT PRIVILEGES和INHERIT ANY PRIVILEGES特权。
不可见列。
对象,而不是类型,是有版次或无版次的。
在SQL中运行得更快的PL/SQL函数。
预定义的查询指令$$ PLSQL_UNIT_OWNER和$$ PLSQL_UNIT_TYPE。
编译参数PLSQL_DEBUG已弃用。
调用者权限函数可缓存结果在Oracle产品中创建存储子程序时,可把它创建为定义者权限(Def?iner Right,DR)单元或调用者权限(Invoker Right,IR)单元。DR单元将以其所有者的权限执行,而IR单元将以调用该特定单元的用户权限执行。默认情况下,除非明确指定,否则存储子程序都将创建为DR单元。一个特定单元是被当作DR还是IR单元由AUTHID属性来控制,此属性可以设置为DEFINER(默认)或CURRENT_USER。
在Oracle 12c之前,使用调用者权限子句(AUTHID CURRENT_USER)创建的函数不能缓存结果。要创建作为IR单元的函数,必须把AUTHID子句添加到函数规范中。
结果缓存函数是其参数值和结果都存储在缓存中的函数。因此,使用相同的参数值来调用这样的函数时,其结果是从缓存中提取的,而不是重新计算的。要对某个函数启用结果缓存,必须把RESULT_CACHE子句添加到函数规范中,如以下例子所示(调用者权限子句和结果缓存子句以粗体突出显示)。
示例以调用者权限创建的结果缓存函数请注意,如果学生ID为230的学生记录已经在结果缓存中,那么此函数将从结果缓存返回学生记录。在相反的情况下,将从STUDENT表选择该学生记录并将其添加到缓存以供将来使用。因为函数的结果缓存依赖于STUDENT表,所以对STUDENT表实施并提交的任何修改都会使get_student_rec函数的所有缓存结果变得无效。
PL/SQL独有的更多数据类型可以跨越PL/SQL到SQL的接口子句在此版本中,Oracle已经在动态SQL和客户端程序(OCI或者JDBC)中扩展了对PL/SQL独有的数据类型的支持。例如,可以在使用EXECUTE IMMEDIATE语句或OPEN FOR、FETCH和CLOSE语句时绑定集合变量。18.3节对本主题进行了更详细的介绍。
ACCESSIBLE BY子句可选的ACCESSIBLE BY子句允许指定可访问正在创建或修改的PL/SQL单元的PL/SQL单元列表。ACCESSIBLE BY子句通常被加入到模块头部,例如,函数或过程头部。在ACCESSIBLE BY子句中列出的每个单元都称为访问器,而该子句本身也称为白名单,如以下例子所示(ACCESSIBLE BY子句以粗体显示)。
示例使用ACCESSIBLE BY子句创建的存储过程在此示例中,有两个过程,test_proc1和test_proc2,并且test_proc1是使用ACCESSIBLE BY子句创建的。其结果是,test_proc1只能由test_proc2访问。这由两个匿名PL/SQL块体现。第一个块执行test_proc2成功。第二个块试图直接执行test_proc1,但其结果出错。
请注意,这两个过程都是在单个模式(STUDENT)中创建的,并且这两个PL/SQL块都是在所有者(STUDENT)的单个会话中执行的。
FETCH FIRST子句FETCH FIRST子句是一个新的可选特性,它通常用在“前N个”查询中,如以下例子所示。本例使用的ENROLLMENT(登记)表包含学生注册数据。每名学生都是通过一个唯一的学生ID标识的,并可注册多个课程。FETCH FIRST子句以粗体显示。
示例使用FETCH FIRST子句进行“前N个”查询请注意FETCH FIRST子句也可与BULK COLLECT INTO子句结合使用,如下所示。FETCH FIRST子句以粗体显示。
示例将FETCH FIRST子句与BULK COLLECT INTO子句结合使用可将角色授予PL/SQL程序包和独立子程序从Oracle 12c开始,可以将角色授予PL/SQL包和独立子程序。需要注意的是,将一个角色授予PL/SQL包或独立子程序不改变其编译。相反,它会影响由PL/SQL单元在运行时发出的SQL语句所需权限的检查方式。
考虑以下例子,其中READ角色被授予get_student_name函数。
示例将READ角色授予get_student_name函数更多的数据类型在SQL和PL/SQL中具有相同的最大大小在Oracle 12c之前,某些数据类型在SQL和PL/SQL中有不同的最大大小。例如,NVARCHAR2在SQL中的最大大小是4000字节,而在PL/SQL中是32?767字节。从Oracle 12c开始,VARCHAR2、NVARCHAR2和RAW数据类型在SQL和PL/SQL中的最大大小都已经扩展到了32?767字节。要在SQL中使用这些最大大小,初始化参数MAX_STRING_SIZE必须设置为EXTENDED。
可插拔数据库上的数据库触发器可插拔数据库(PDB)是Oracle的多租户架构的组成部分之一。通常它是可移植的模式和其他数据库对象的一个集合。从Oracle 12c开始,可以在PDB上创建事件触发器。触发器的详细信息是在第13章和第14章提供的,请注意,PDB是在本书范围之外的,但它们的详细信息可在Oracle的联机《Administration Guide》(管理指南)中找到。
LIBRARY可定义为DIRECTORY对象,并可带有CREDENTIAL子句LIBRARY(库)是与操作系统的共享库相关联的模式对象。它是在CREATE OR REPLACE LIBRARY语句的帮助下创建的。
DIRECTORY(目录)也是将一个别名映射到服务器文件系统的实际目录上的对象。第25章很简要地提及了DIRECTORY对象,这是作为PL/SQL剖析器API和PL/SQL层次式剖析器安装过程的一部分介绍的。在Oracle 12c版本中,LIBRARY对象可以定义为一个带有可选CREDENTIAL子句的DIRECTORY对象,如下所示。
示例把LIBRARY创建为DIRECTORY对象在本例中,LIBRARY对象my_lib被创建为DIRECTORY对象。'plsql_code'是DIRECTORY对象my_dir中的动态链接库(DDL)的名称。请注意,要成功地创建这个库,必须预先创建DIRECTORY对象my_dir。LIBRARY和DIRECTORY对象的详细信息可以在Oracle的联机《Database PL/SQL Language Reference》(数据库PL/SQL语言参考)中找到。
隐式语句结果在Oracle 12c版本之前,SQL查询的结果集是通过REF CURSOR输出参数从存储的PL/SQL子程序明确地返回的。其结果是,调用者程序必须绑定到REF CURSOR参数并明确地提取结果集。
从此版本开始,REF CURSOR输出参数可以由DBMS_SQL包的两个过程,RETURN_RESULT和GET_NEXT_RESULT来代替。这些过程使能存储的PL/SQL子程序隐式地返回SQL查询的结果集,如下例所示(对RETURN_RESULT过程的引用以粗体突出显示):
示例使用DBMS_SQL.RETURN_RESULT过程在本例中,test_return_result过程将教师的名字和姓氏隐式地返回客户端应用程序。需要注意的是,游标SELECT语句使用了FETCH FIRST ROW ONLY子句,这也是在Oracle 12c中引入的。要成功地从test_return_result过程获得结果集,客户端应用程序必须同样升级到Oracle 12c。否则,它将返回以下错误消息:
BEQUEATH CURRENT_USER视图在Oracle 12c中,视图只可以创建为定义者权限单元。从12c版本开??始,视图也可以创建为一个调用者权限单元(这类似于存储子程序的AUTHID属性)。但是,对于视图,这种行为是通过在创建它的时候指定BEQUEATH DEFINER(默认值)或BEQUEATH CURRENT_USER子句达成的,如以下例子所示(BEQUEATH CURRENT_USER子句以粗体显示):
示例使用BEQUEATH CURRENT_USER子句创建视图在本例中,my_view创建为IR单元。请注意,将这个属性添加到视图中并不影响它的主要用途。相反,类似于AUTHID属性,它确定从该视图选择数据的时候将应用哪组权限。
INHERIT PRIVILEGES(继承特权)和INHERIT ANY PRIVILEGES(继承任何特权)特权从Oracle 12c开始,只有当某个调用者权限单元的所有者具有INHERIT PRIVILEGES或INHERIT ANY PRIVILEGES特权时,该单元才会以调用者的权限执行。例如,在Oracle 12c之前,假设user1把一个函数F1创建为一个调用者权限单元,并把对它执行的权限授予正好有比user1更多特权的用户user2。然后,当user2运行F1函数时,该函数将以user2的权限运行,这可能会执行user1也许没有权限执行的操作。在Oracle 12c中,情况已不再是这样。如前所述,这样的行为必须明确地通过INHERIT PRIVILEGES或INHERIT ANY PRIVILEGES特权来指定。
不可见列从Oracle 12c开始,可以定义和操作不可见列。在PL/SQL中,定义为%ROWTYPE的记录能意识到这样的列,如以下例子所示(对不可见列的引用以粗体显示):
示例%ROWTYPE记录和不可见列正如这个例子所展示的,由于引用了不可见列,匿名PL/SQL块的第一次运行未能完成。一旦再次把NUMERIC_GRADE列设置为可见,脚本就能够成功完成。
对象,而不是类型,是有版次或无版次的版本是基于版本的重定义功能的一个组成部分,这种功能允许你创建对象的一个副本(例如,PL/SQL包),并对它进行更改,而不影响可能依赖于它的其他对象或使之无效。随着此功能的引入,在数据库中创建的对象可以定义为有版次或无版次的。对于有版次的对象,其对象类型必须是有版次的,它必须有EDITIONABLE属性。同样,对于无版次的对象,其对象类型必须是无版次的或者它必须有NONEDITIONABLE属性。
从Oracle 12c开始,你能够在CREATE OR REPLACE和ALTER语句中指定某个模式对象是有版次的或无版次的。在这个新版本中,已启用版次的用户(模式),即使它在数据库中的类型是有版次的,但只要在模式本身中的类型是无版次的或如果此对象具有NONEDITIONABLE属性,它就能够拥有一个无版次对象。
在SQL中运行得更快的PL/SQL函数从Oracle 12c开始,可以在SQL语句中创建调用时可能运行得更快的用户定义的函数。这可以用如下方法完成:
在SELECT语句的WITH子句中声明用户定义的函数。
使用UDF编译指示创建用户定义的函数。
考虑下面的示例,其中的format_name函数是在SELECT语句的WITH子句中创建的。这个新创建的函数返回格式化的学生姓名。
示例在WITH子句中创建一个用户定义的函数接下来,考虑用UDF编译指示创建format_name函数的另一个示例。
示例在UDF编译指示中创建一个用户定义的函数预定义的查询指令$$PLSQL_UNIT_OWNER和$$PLSQL_UNIT_TYPE在PL/SQL中,有大量预定义的查询指令,如下表所述(为了强调,$$PLSQL_UNIT_OWNER和$$PLSQL_UNIT_TYPE以粗体显示):
名称说明$$PLSQL_LINE它是出现在PL/SQL子程序中的代码行的编号$$PLSQL_UNITPL/SQL子程序的名称。对于匿名PL/SQL块,它设置为NULL$$PLSQL_UNIT_OWNER12c版本中新增的指令。它是PL/SQL子程序的所有者(模式)。对于匿名PL/SQL块,它设置为NULL$$PLSQL_UNIT_TYPE12c版本中新增的指令。它是PL/SQL子程序的类型——例如,FUNCTION、PROCEDURE或PACKAGE BODY$$plsql_compilation_parameter一组PL/SQL编译参数,其中有些是PLSQL_CODE_TYPE,它指定PL/SQL子程序的编译模式。而另外一些是PLSQL_OPTIMIZE_LEVEL(将在第25章探讨)下面的示例演示了指令的可能用法。
示例使用预定义的查询指令编译参数PLSQL_DEBUG已弃用从Oracle 12c版本开始,PLSQL_DEBUG参数已弃用。若要为了调试而编译PL/SQL子程序,PLSQL_OPTIMIZE_LEVEL参数应设置为1。第25章非常详细地讨论了PLSQL_OPTIMIZE_LEVEL参数和PL/SQL性能优化器支持的各种优化级别。
規格參數
品牌 | 京東圖書 |
品牌屬地 | 中國 |

下載亞米應用
意見反饋
為您推薦
-60%

然利
27種選擇
然利 手工金山角蛋糕 營養早餐麵包 大麥若葉味 95g *5【5份超值裝】【產品包裝袋保質期讀法:月/日/年】
5.0
(1)
訂閱成功!
您的郵箱將很快會收到一封郵件
您的郵箱 :
評論
分享您的感受,幫助更多用戶做出選擇。
撰寫評論