版本11.1 新功能
正则表达式SQL函数的增强
正则表达式SQL函数regexp_instr和regexp_substr功能已经增强。
还有一个新的函数regexp_count,返回模式在字符串中出现的次数。
simple_integer, simple_float和simple_double数据类型
这4种数据类型分别是预定义pls_integer, binary_float, binary_double的子类型。每个类型与其对应的基类型有相同的范围,有not null约束。
simple_integer与pls_integer在溢出语义上有很在差别,但simple_float和simple_double除了not null约束外,与基类型相同。
如果值不会为null,并且溢出检查不是必须的,则可以使用simple_integer类型。
如果值不会为null,也可以使用simple_float和simple_double。
因为没有通常的检查null和溢出的开销,这些子类型可以比它们的基类型提供显著的更好的性能,当PLSQL_CODE_TYPE='NATIVE',因为对simple_integer的算术操作直接在硬件上完成;如果PLSQL_CODE_TYPE='INTERPRETED',则性能提升很小。
continue语句
使用该语句可以退出循环的当次迭代,并将控制权转向下一次迭代。continue语句有2种形式:
n continue(无条件的)
n continue when (有条件的)
PL/SQL表达式中的序列
伪列currval和nextval使得书写PL/SQL源文本更容易,并提高运行时的性能和可扩展性。
可以在使用number表达式的地方使用 序列名.curval和序列名.nextval。
动态SQL加强
无论是本地动态SQL还是dbms_sql包都得到了增强。
本地动态SQL现在支持clob,所以支持超过32KB的动态SQL语句。
在DBMS_SQL包中:
n 所有本地动态SQL支持的类型都支持。
n dbms_sql.parse函数接受clob参数,允许动态SQL语句超过32KB。
n dbms_sql.to_refcursor函数允许将dbms_sql包转换为本地动态SQL。
n dbms_sql.to_cursor函数允许将本地动态SQL转换为dbms_sql包
PL/SQL子程序调用中的命名和混合记法
在11.1之前,一个调用PL/SQL子程序的SQL语句必须按位置指定实参。
而11.1中基于命名的和混合的记法都是允许的。
这样当SQL语句调用一个有多个默认参数的PL/SQL子程序并且只有少数实参需要提供与默认值不同的值时,可以提高可用性。
create or replace function compute_bonus(emp_id NUMBER, bonus NUMBER) return number is emp_sal number; begin select salary into emp_sal from employees where employee_id = emp_id;
return emp_sal + bonus; end compute_bonus; / select compute_bonus(120, 50) from dual; -- 基于位置 select compute_bonus(bonus => 50, emp_id => 120) from dual; -- 命名 select compute_bonus(120, bonus => 50) from dual; -- 混合 |
PL/SQL函数结果缓存
函数结果缓存可以节省相当的空间和时间。每次使用不同的参数调用结果缓存函数时,这些参数和结果被存储到缓冲区中,然后当使用相同的参数调用相同的函数时,会从缓冲区获取结果,而不是重新计算。
在11.1之前,如果想让PL/SQL程序缓存函数的结果,必须对缓存和缓存管理子程序进行设计和编码。如果多个会话运行你的应用,每个会话必须有它自己的缓存和缓存管理子程序的拷贝。有时每个会话必须执行相同的代价高昂的计算。
在11.1中,PL/SQL提供了函数结果缓存。为了使用函数结果缓存,可以在每个想缓存结果的PL/SQL函数中使用result_cache子句。因为函数结果缓存存在于SGA中,运行你应用的任何会话都可以访问。
在将你的应用转化为PL/SQL函数结果缓存之后,它会使用更多的SGA,但是会使用相当少的整个系统内存。
复合DML触发器
创建在表上或editioning视图上的复合DML触发器可以在多个时间点被触发。每个时间点部分都有自己的执部分和可选的异常处理部分,所有的这些部分都可以访问常规的PL/SQL state。常规state开始于触发语句开始,消失于触发语句结束,甚至是当触发语句产生错误时。
在11.1之前,开发者使用从属包来模块化常规状态。这种方法当触发语句出现错误和语句后触发器没有触发时,对应用程序是难处理的,也可能导致内存泄露。当你实现的行为需要在多个时间点共享数据时,复合触发器提供了辅助的方法。
对触发器的更多控制
create trigger语句现在支持enable, disable, follows子句,可以对触发器有更多的控制。
disable允许创建一个disable状态的触发器,这样可以在enable一个触发器之前确保触发器代码成功编译。
enable显示地指定的默认的触发器状态。
follows可以控制建立在相同表上或拥有相同时间点的触发器的触发顺序。
自动子程序内联
子程序内联会将子程序调用替换为被调用的子程序的拷贝,这可以提高程序的性能。
可以使用PRAGMA INLINE指定单独的子程序的调用是否内联;也可以设置PLSQL_OPTIMIZE_LEVEL = 3,默认值为2来开启自动内联,让编译器来寻找内联机会。
当自动内联不会提升应用程序性能的情况下(很少),可以使用PL/SQL层次分析器来识别想关掉内联的子程序。
PL/Scope
它是一个编译器驱动的工具,可以用来收集和组织PL/SQL源代码中用户定义的标识符的数据。因为它是一个编译器驱动的工具,所以需要在交互式的环境(如SQL Developer或JDeveloper)中使用它,而不是直接使用。
PL/SQL层次剖析器
它报告你的PL/SQL程序的动态执行纲要,通过子程序调用来组织。它分别计数SQL和PL/SQL的执行次数。在动态执行纲要的每个子程序层次的概览中包括子程序的调用次数、子程序自己执行的时间、子程序分支树上花费的时间、详细的父子关系等信息。
可以在浏览器中查看生成的HTML报告。浏览器的导航能力和优选出来的链接提供了有效的方法来分析大应用程序,提高应用程序的性能,降低开发成本。
PL/SQL本地编译器直接产生本地代码
PL/SQL本地编译器直接产生本地代码,而不是将PL/SQL代码转换成C代码,再由C编译器产生本地代码。一个个人开发者可以编译PL/SQL单元进行本地执行,而不需要在DBA部分进行安装。本地编译的PL/SQL程序的执行速度提升了,有些情况下成数量级提升。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1101951/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1101951/