OraclePLSQL之子程序和包
下载
第5章 使用子程序和包
在上一章中,我们讨论了创建过程,函数和包的细节。在本章中,我们介绍这些部件的功
能,存储子程序和本地子程序的区别,存储子程序与数据字典的交互方式及如何从 S Q L语句中
调用存储子程序。除此之外,我们还要介绍 O r a c l e 8 i存储子程序的新增特性。
5.1 子程序位置
我们已在前几章中演示了可以存储在数据字典中的子程序和包。子程序首次是用命令
C R E ATE OR REPLACE创建的,接着,我们可以从其他 P L / S Q L块中调用已创建的子程序。除此
之外,子程序可以在块的声明部分定义,以这种方式定义的子程序叫做本地子程序。包则必须
存储在数据字典中,而不能在本地定义存储。
5.1.1 存储子程序和数据字典
当使用命令C R E ATE OR REPLACE 创建子程序时,该子程序就存储在数据字典中。除去子
程序中的源文本外,该子程序是以编译后的中间代码形式存储的,这种中间代码叫做 p - c o d e 。中
间代码中带有子程序中经计算得到的所有引用参数,子程序的源代码也被转换为 P L / S Q L 引擎易
读的格式。当调用子程序时,就将中间代码从磁盘读入并启动执行。一旦从磁盘读入 中间代码,
系统就将其存储在系统全局工作区( S G A )的共享缓冲区部分,以便由多个用户同时进行访问。
与缓冲区的所有内容一样,根据系统采用的最近最少使用的算法,过期的中间代码将被从共享
缓冲区中清除。
中间代码类似于由3 G L语言生成的对象代码,或者类似于可由 J a v a运行时使用的J a v a字节码。
由于中间代码带有经计算得到的子程序中的所有对象引用(属于前联编的属性),所以,执行中
间代码的效率非常高。
子程序的信息可以通过各种数据字典视图来访问。视图 u s e r _ o b j e c t s包括了当前用户拥有的
所有对象的信息。该信息包括了对象的创建以及最后修改的时间,对象类型(表,序列,函数
等)和对象的有效性。视图 u s e r _ s o u r c e 包括了对象的源程序代码。而视图 u s e r _ e r r o r s则包括了编
译错误信息。
请看下面的简单过程:
CREATE OR REPLACE PROCEDURE Simple AS
v_Counter NUMBER;
BEGIN
v_Counter := 7;
END Simple;
创建该过程后,视图 u s e r _ o b j e c t s 显示该过程是合法的,视图 u s e r _ s o u r c e 则包括了该过程的
源代码。由于该过程已经编译成功,所以视图 u s e r _ e r r o r s 没有显示错误。图 5 - 1 的窗口显示了上
第5章 使用子程序和包计计149
下载
述信息。
如果我们修改了过程 S i m p l e 的代码,就会出现编译错误(源程序中缺少一个分号),修改过
的该过程如下:
CREATE OR REPLACE PROCEDURE Simple AS
v_Counter NUMBER;
BEGIN
v_Counter := 7
END Simple;
图5-1 成功编译后的数据字典视图
分析图5 - 2所示的相同的三个数据字典,我们不难看出有几个不同之处。首先, u s e r _ s o u r c e 仍然
显示了该过程的源代码。然而, u s e r _ o b j e c t s 中的状态指示为非法,而不是前面例子的合法提示,
u s e r _ e r r o r s 中有一条编译错误信息P L S - 1 0 3 。
提示 在SQL *Plus 中,命令SHOW ERRORS将为用户查询u s e r _ e r r o r s 并将输出数据格
式为用户可读的形式。该命令将返回最后创建的对象的错误信息。如果编译程序出现了
错误提示: ‘Warn