1 12c语言,1.4.1 Oracle数据库12c中PL/SQL的新特性

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值