服务器 频道

Oracle 定义存储子过程与包

IT168 服务器学院】当你着手创建存储子程序和包的时候,真正的O r a c l e 8 i应用开发开始了,存储子程序和包
是经过编译并存储在数据库中的永久程序代码模块。它们是你设计的可共享、可重入并且可
重用的软件对象。可以使用支持远程过程调用的语言从其他的P L / S Q L模块、S Q L语句以及客
户端应用中调用它们。
当你编译了一个存储子程序或包时,程序的源代码、编译代码、编译状态以及全部编译
错误存储到数据字典中。各种不同的数据字典视图可以帮助你查看这些项。使用U S E R _视图,
能够得到关于所编译模块的信息;使用A L L _视图,能够得到其他人编译并授权你访问的相关
模块限制信息;假如你拥有数据库系统管理员权限,使用D B A _视图,可以得到任何人编译的
全部信息。这些视图在表2 9 - 1中列出(为了简便,作为D B A _视图列出)。
表29-1 存储子程序和包的数据字典视图
视图名称说明
D B A _ S O U R C E 所有编译模块的文本源代码
D B A _ E R R O R S 全部模块编译错误的文本列表清单
D B A _ O B J E C T _ S I Z E 编译模块的状态,例如有效性、源代码以及对象大小
D B A _ O B J E C T S 编译模块种类(存储过程、函数、包、包程序体)
D B A _ D E P E N D E N C I E S 对象相关性列表,例如在包中引用的表
不存在暴露对象代码的视图,因为根本不需要看到它。你要知道的一切就是它是不是在
这里以及它是否是合法的。当一个相关对象被修改或删除时,例如向一个表添加一列或删除
一个表时,一个已编译模块变为非法。如果一个存储模块变为非法,必须由服务器自动地重
新编译它或由它的拥有者手工编译它。

     建立与使用存储程序
     创建存储子程序的语法与在匿名P L / S Q L块中定义子程序的语法非常类似。除含一些额外
增加的特性外,存储子程序拥有子程序的全部相同特性,这些特性你已经在前面学习编写过。
让我们使用你先前看到的b o o l _ t o _ c h a r函数编写一个存储函数(参见清单2 9 - 1)。

CREAT OR REPLACE FUNCTION bool_to_char(Pbool IN BOOLEAN)
RETURN VARCHAR2 IS
 str VARCHAR2(5);...capture string to return
 BEGIN
 IF(Pbool)THEN ...test Boolean value for TRUE
  str:=''true'';
  ELSE(NOT Pbool) THEN ...FALSE
  str:=''NULL'';
  END IF ;...test Boolean value
  RETURN (str);
 END bool_to_char;
 /
清单29-1 BOOL2CHR.SQL—编写重用代码存储子程序
服务器回答:
    这就是你所得到的一切。服务器并不执行程序,它仅编译程序,以便日后当你从其他的
P L / S Q L块中调用它时,你可以执行它。
提示C R E ATE OR REPLACE语法创建一个新函数或替换一个已有函数。这意味着不
需要给存储代码增加重编译或改变的源代码,而是使用新版本完全代替它们。
警告当使用C R E ATE OR REPLACE时,需要良好的源代码管理手段。当替换子程序
时,老代码将永远从数据字典中消失。它还意味着在模式中只能含有一个拥有这个名
字的对象。
现在,使用一个未命名P L / S Q L块运行这个新创建的存储函数,如程序清单2 9 - 2中所示。
清单29-2 TESTBOOL.SQL—测试执行存储子程序


      这个例子差不多测试了存储函数可能返回值的全部可能性。它被称为一个单元测试。对
于每项输入,验证它的输出结果。输入值应该测试所有的临界状态(输入定义限制内或接近
输入限制的值,包括限制之间的一些随机值)。应该给你的存储子程序准备单元测试文件,就
像这个文件,那么你就可以检验并验证你的代码是否工作正确。将单元测试程序与存储子程
序一起保留,以便当你修改子程序的时候,可以再次测试它。

0
相关文章