ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PL/SQL经典学习笔记(2-5)

PL/SQL经典学习笔记(2-5)

原创 Linux操作系统 作者:LuiseDalian 时间:2013-01-10 12:53:08 0 删除 编辑

1 Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2) Part Number E25519-03

1.1 PL/SQL新功能

1.1.1 版本11.2.0.2新功能

如果在整个会话生命周期声明是不变的,则包被认为是无状态的。

 

在11.2.0.2之前,如果一个会话编译了一个有状态的包的包体,并且已经实例化该包的其它会话已经引用了它,则后面的会话将会产生一个严重的破坏性的错误ora-04068,因此进行hot-patching的包可能会使它的使用者陷入混乱。

 

对于在编译时包的所有成员保持不变的包来讲就属于这种情况。因此hot-patching包就会很少可能破坏正在使用它的会话了。

1.1.2 版本11.2.0.1新功能

DBMS_PARALLEL_EXECUTE包

该包允许不断地以并行的方式更新大表中的数据,使用2个高层次的步骤:

n  将表中的行集分组到更小的chunks中。

n  并行地应用希望的update语句,每当一个chunk处理完成之后进行提交。

建议:当更新大量数据的时候采用此技术。可以提高性能、降低回滚空间的消耗、减少持有的行锁的数量。

 

在create type语句中的force选项

在11.2之前,如果一个create or replace type语句指定一个存在的类型,而这个类型具有类型依赖或表依赖,则该语句会失败返回错误ora-02303。从11.2开始,如果你指定force,该语句只在指定的类型有表依赖时会失败。

 

crossedition触发器

该触发器是在DML语句改变数据库表,而与此同时一个使用该表的在线应用程序正在使用基于版本的重定义进行补丁或更新。crossedition触发器的体被设计用来处理这些改变,这样可以在应用程序代码改变结束后被正确地应用。

 

alter type语句对于特定版本ADT的限制

如果你使用基于版本的重定义来补丁或升级应用程序,则你就使用了版本对象。如果你的任何版本对象是ADT(抽象数据类型),则参考类型限制。

 

alter type语句的reset选项

该选项重新设置类型的版本为1,所以它不再会被认为是演化了。

 

自动检测结果缓存函数的数据源

在11.2之前,必须指定缓存结果依赖的数据源。

而11.2中数据库可以自动检测到结果缓存函数运行时查询的所有数据源。

 

在Oracle RAC环境中结果缓存不再是私有的

对于11.1在Oracle RAC环境中的每个数据库实例都有一个私有的函数结果缓存,只有在那个实例上的会话才可以访问。如果在本地实例的私有缓冲区中没有需要的结果,则函数体会运行以计算结果,然后结果被加载到本地缓冲区中。结果不是从其它实例的私有缓冲区获得的。

对于11.2每个数据库实例管理管理它们自己的本地结果缓冲区,但本地的结果缓冲区不再是私有的了,连接到远程数据库实例的会话可以访问它的内容。如果在本地实例缓冲区中没有需要的结果,则结果可能从其它实例的本地缓冲区获得,而不是在本地计算。

1.1.3 版本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函数结果缓存

函数结果缓存可以节省相当的空间和时间。每次使用不同的参数调用结果缓存函数时,这些参数和结果被存储到缓冲区中,然后当使用相同的参数调用相同的函数时,会从缓冲区获取结果,而 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-752444/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论