欢迎来到天天文库
浏览记录
ID:9219907
大小:1.56 MB
页数:47页
时间:2018-04-23
《oracleplsql之子程序和包》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、下载第5章使用子程序和包在上一章中,我们讨论了创建过程,函数和包的细节。在本章中,我们介绍这些部件的功能,存储子程序和本地子程序的区别,存储子程序与数据字典的交互方式及如何从SQL语句中调用存储子程序。除此之外,我们还要介绍Oracle8i存储子程序的新增特性。5.1子程序位置我们已在前几章中演示了可以存储在数据字典中的子程序和包。子程序首次是用命令CREATEORREPLACE创建的,接着,我们可以从其他PL/SQL块中调用已创建的子程序。除此之外,子程序可以在块的声明部分定义,以这种方式定义的子程序叫做本地子程序。包则必须存储在数据字典中,而
2、不能在本地定义存储。5.1.1存储子程序和数据字典当使用命令CREATEORREPLACE创建子程序时,该子程序就存储在数据字典中。除去子程序中的源文本外,该子程序是以编译后的中间代码形式存储的,这种中间代码叫做p-code。中间代码中带有子程序中经计算得到的所有引用参数,子程序的源代码也被转换为PL/SQL引擎易读的格式。当调用子程序时,就将中间代码从磁盘读入并启动执行。一旦从磁盘读入中间代码,系统就将其存储在系统全局工作区(SGA)的共享缓冲区部分,以便由多个用户同时进行访问。与缓冲区的所有内容一样,根据系统采用的最近最少使用的算法,过期的中
3、间代码将被从共享缓冲区中清除。中间代码类似于由3GL语言生成的对象代码,或者类似于可由Java运行时使用的Java字节码。由于中间代码带有经计算得到的子程序中的所有对象引用(属于前联编的属性),所以,执行中间代码的效率非常高。子程序的信息可以通过各种数据字典视图来访问。视图user_objects包括了当前用户拥有的所有对象的信息。该信息包括了对象的创建以及最后修改的时间,对象类型(表,序列,函数等)和对象的有效性。视图user_source包括了对象的源程序代码。而视图user_errors则包括了编译错误信息。请看下面的简单过程:CREATE
4、ORREPLACEPROCEDURESimpleASv_CounterNUMBER;BEGINv_Counter:=7;ENDSimple;创建该过程后,视图user_objects显示该过程是合法的,视图user_source则包括了该过程的源代码。由于该过程已经编译成功,所以视图user_errors没有显示错误。图5-1的窗口显示了上第5章使用子程序和包计计149下载述信息。如果我们修改了过程Simple的代码,就会出现编译错误(源程序中缺少一个分号),修改过的该过程如下:CREATEORREPLACEPROCEDURESimpleASv_
5、CounterNUMBER;BEGINv_Counter:=7ENDSimple;图5-1成功编译后的数据字典视图分析图5-2所示的相同的三个数据字典,我们不难看出有几个不同之处。首先,user_source仍然显示了该过程的源代码。然而,user_objects中的状态指示为非法,而不是前面例子的合法提示,user_errors中有一条编译错误信息PLS-103。提示在SQL*Plus中,命令SHOWERRORS将为用户查询user_errors并将输出数据格式为用户可读的形式。该命令将返回最后创建的对象的错误信息。如果编译程序出现了错误提示:
6、‘Warning:Procedurecreatedwithcompilationerrors’时,就可以使用该命令查询错误的详细信息。有关SQL*Plus的详细介绍,请看本书第2章中介绍PL/SQL开发工具的内容。虽然非法的存储子程序仍然在数据字典中,但是该子程序只有在将编译错误修改后才能调用。如果调用了非法的过程,就会引发PLS-905错误,下面的例子演示了这种非法调用产生的错误:150计计第二部分非对象功能下载图5-2编译出错后的数据字典SQL>BEGINSimple;END;2/BEGINSimple;END;*ERRORatline1:O
7、RA-06550:line1,column7:PLS-00905:objectEXAMPLE.SIMPLEisinvalidORA-06550:line1,column7:PL/SQL:Statementignored有关数据字典的内容将在本书的配套光盘中的附录C给予详细的介绍。5.1.2本地子程序下面的程序是一个在PL/SQL块的声明部分声明的本地子程序的例子:节选自在线代码localSub.sqlDECLARECURSORc_AllStudentsISSELECTfirst_name,last_nameFROMstudents;v_Forma
8、ttedNameVARCHAR2(50);第5章使用子程序和包计计151下载/*Functionthatwillreturnthefir
此文档下载收益归作者所有