|
|
|
|
移动端

1.4.1 Oracle数据库12c中PL/SQL的新特性

《Oracle PL/SQL程序设计(第6版)(上下册)》本书基于Oracle数据库12C,从用PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、构造PL/SQL应用程序、高级PL/SQL等6个方面详细而系统地讨论了PL/SQL以及如何有效地使用它。本节为大家介绍Oracle数据库12c中PL/SQL的新特性。

作者:方鑫 译来源:人民邮电出版社|2017-09-06 18:57

技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!


1.4.1 Oracle数据库12c中PL/SQL的新特性

Oracle数据库12c提供了一些新特性以提高PL/SQL的性能和易用性,同时也对原语言的粗略之处进行了雕琢。下面我们总结出了对于PL/SQL开发者而言,最重要的一些变化。

在PL/SQL-to-SQL接口处,增加了更多的仅适用于PL/SQL的数据类型

在12.1版本之前,我们不能将PL/SQL特有的数据类型(如关联数组)放到一个动态的SQL语句中,但12.1版本中,允许在匿名过程块、SQL查询的函数调用,CALL语句、SQL语句中的表操作中绑定PL/SQL特有数据类型的值。

ACCESSIBLE_BY子句

我们现在可以在包声明中包括ACCESSIBLE_BY子句,用以指定哪些程序单元可以调用过程包中的子程序。这个特性,使得我们可以在帮助程序包中“公开”那些只能由特定程序单元调用的子程序。此特性为程序包提供了一种类似“白名单”的功能。

隐式语句结果

在Oracle数据库12c之前,一个PL/SQL存储子程序的结果,是通过SQL查询的OUT REF CURSOR参数或RETURN子句显式地返回的。客户端的程序则需要显式地绑定这些参数,以便收到结果集。而现在,一个PL/SQL存储过程子程序可以隐式地将查询结果返回到客户端,不再使用OUT REF CURSOR参数,而是使用PL/SQL中的DBMS_SQL程序包。此功能将使那些需要从存储过程子程序(Transact SQL等语言支持的)中得到查询结果的应用程序,轻松地从第三方数据库平台迁移到Oracle数据库平台上。

BEQUEATH CURRENT_USER视图

在Oracle 12c数据库之前的版本中,视图是被作为一个定义者的权限单元(AUTHID DEFINER)来进行访问控制的,即使它是在调用者的权限单元中被调用的(AUTHID CURRENT_USER)。而在新的版本中,一个视图既能是BEQUEATH DEFINER(默认设置),表现为定义者的权限单元,也能是BEQUEATH CURRENT_USER,即类似调用者权限单元的表现。

给程序单元定义角色

在Oracle数据库12c之前的版本中,一个调用者的权限单元,总是以调用者的权限进行运行的。如果它的调用者的权限大于它的所有者,在这样的情况下,程序单元的运行就可能越过所有者预设的边界,造成意想不到的后果。

在12.1版本中,我们可以给单个PL/SQL过程包甚至是里面单独的子程序定义角色,我们不是使用定义者权限单元,而是创建一个调用者权限单元,然后将角色赋给它。调用者权限单元就在调用者和角色的权限规定之下运行,不再拥有从定义者schema下继承的任何其他权限。

现在,只有当它的所有者对调用者拥有INHERIT PRIVILEGES权限或INHERIT ANY PRIVILEGES权限时,一个调用者权限单元才能够在它的调用者的权限范围内运行。

提示 

在安装或升级时,INHERIT PRIVILEGES权限就被授予了所有的schema。

新增的条件编译指令

在12.1版本中,Oracle新增了两个预定义的查询指令,$$PLSQL_UNIT_OWNER和$$PLSQL_UNIT_TYPE,它们的返回值是当前PL/SQL程序单元的所有者和类型。

在SQL中优化函数的执行

在SQL语句中,Oracle目前提供两种提高PL/SQL函数执行性能的方法:我们可以用WITH语句,直接在SQL语句中定义函数;或者我们可以在程序单元中增加UDF编译指示,告知编译器此函数将会主要在SQL语句中使用。

在不可见列使用%ROWTYPE

Oracle 12c数据库中,我们可以定义“不可见”列。在PL/SQL内部,已经对%ROWTYPE这种列的各种属性有了对应的处理方法。

FETCH FIRST子句和BULK COLLECT

在12.1版本中,我们可以使用FETCH FIRST子句,来限制一个查询返回的行的数量,相比通常使用“TOP N”来进行限定的查询,可以显著降低SQL的复杂度。FETCH FIRST最大的益处在于,当从第三方数据库平台迁移应用到Oracle数据库平台时,可以极大地简化迁移难度。FETCH FIRST子句也可以帮助提高一些SELECT BULK COLLECT INTO语句的性能。

UTL_CALL_STACK过程包

在12.1版本之前,DBMS_UTILITY过程包提供3个函数(FORMAT_CALL_STACK、FORMAT_ERROR_STACK和FORMAT_ERROR_BACKTRACE)来提供程序运行调用堆栈、错误堆栈和错误回溯的对应信息。在12.1版本中,新的过程包UTL_CALL_STACK不仅可以提供相同的功能,同时对访问字符串的内容进行了更细粒度的控制。

喜欢的朋友可以添加我们的微信账号:

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

SQL Server 2005实现与维护(MCTS教程)

本书是微软认证技术专家(MCTS) 70-431考试的专用教材,全书共21章,围绕着考查目标,通过详尽的描述、大量课程和课后测试,全面介绍了SQL S...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊