没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
下载
第29章 使用存储子过程、包与提供的包
本章要点:
定义存储子过程与包
建立与使用存储程序
使用S H O W E R R O R S调试
检查存储程序或包的状态
建立与使用包
关于Oracle 8i数据库提供的包
描述提供的包
开始学习Oracle 8i提供的包
使用Oracle 8i提供的包
29.1 定义存储子过程与包
当你着手创建存储子程序和包的时候,真正的 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 对象相关性列表,例如在包中引用的表
不存在暴露对象代码的视图,因为根本不需要看到它。你要知道的一切就是它是不是在
这里以及它是否是合法的。当一个相关对象被修改或删除时,例如向一个表添加一列或删除
一个表时,一个已编译模块变为非法。如果一个存储模块变为非法,必须由服务器自动地重
新编译它或由它的拥有者手工编译它。
29.2 建立与使用存储程序
创建存储子程序的语法与在匿名 P L / S Q L块中定义子程序的语法非常类似。除含一些额外
增加的特性外,存储子程序拥有子程序的全部相同特性,这些特性你已经在前面学习编写过。
让我们使用你先前看到的b o o l _ t o _ c h a r函数编写一个存储函数(参见清单 2 9 - 1)。
清单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
—
测试执行存储子程序
这个例子差不多测试了存储函数可能返回值的全部可能性。它被称为一个单元测试。对
于每项输入,验证它的输出结果。输入值应该测试所有的临界状态(输入定义限制内或接近
输入限制的值,包括限制之间的一些随机值)。应该给你的存储子程序准备单元测试文件,就
像这个文件,那么你就可以检验并验证你的代码是否工作正确。将单元测试程序与存储子程
序一起保留,以便当你修改子程序的时候,可以再次测试它。
470计计第六部分计Oracel 接口和应用工具
下载
在运行程序清单2 9 - 2 后,服务器送回下列输出结果信息:
如果尝试传入一个不是布尔值的其他值,将会发生什么?试试看:
服务器响应下列信息:
错误消息表明这是一个编译错误。 P L / S Q L引擎的强类型检查捕获这个错误并返回详尽的
错误消息。
看一下另外一个略微长一些的存储过程例子,如程序清单 2 9 - 3所示:
清单29-3 SHOWINDX.SQL
—
显示表的索引信息的存储过程
第29章计使用存储子过程、包与提供的包计计471
下载
这一次,服务器返回下面信息:
要执行这个过程,可以从一个匿名 P L / S Q L 块中调用它,或者简单地使用 E X E C U T E 命令
单行调用它:
提示 E X E C U T E命令只能用于运行单行语句。如果语句包含两个或多个语句行,必须
使用匿名P L / S Q L块(使用B E G I N…E N D )。如果将两条或多条语句塞入一行,仍旧可
以使用E X E C U T E命令。实际上,E X E C U T E命令将一行扩展为一个P L / S Q L块,它仅仅
是简写形式。
下面是作者的测试系统生成的输出结果信息:
第一次运行这个存储过程时,当等待服务器将过程加载到内存中的时候,你或许注意到
了一个略微的停顿。在继续进行的调用中,因为过程已经被加载到数据库的高速缓存,运行
它的速度明显加快了。
这个特定的例子展示了一些良好的特性,它们是在你自己的存储过程中所需要的。你应
该与局部变量声明的结构保持一致,并且以相同的顺序放置它们。还有,注意例外处理程序
中的块,一定要关闭游标,以免一个错误把它设为打开状态。如果没有这样做而且遇到一个
例外,下一次当运行这个存储过程的时候,将由于 C U R S O R _ A L R E A D Y _ O P E N 错误立即产生
472计计第六部分计Oracel 接口和应用工具
下载
故障。因为游标在会话内保持打开状态直到它被关闭或会话结束。为了清除打开的游标,你
的用户将不得不重新连接数据库。
如果用户需要显示所有的表和它们的索引,只需要简单地删除单独输入参数(和括号),
就像下面所示:
EXECUTE show_index;
必须将自己放到用户的角度来设想用户希望采用哪种方式使用这个工具。更好的方法是
询问用户。
29.2.1 从SQL调用存储子过程
假设不满意O r a c l e 8 i提供的内建函数 TO _ N U M B E R ()。你的抱怨可能是一个字符到数字
的转换失败了,原因是字符串不能表示一个合法的数字, S Q L 失败并突然终止。你所希望的
是,至少错误能够被准确地处理,那么就可以继续处理剩余的数据集了。尝试使用存储函数
解决这个问题,如程序清单 2 9 - 4 中所示:
清单29-4 CHAR2NUM.SQL
—
字符到数字转换
可以采用两种方式运行这个存储函数:
■ 从一个P L / S Q L 块。
■ 从一条S Q L语句。
首先,尝试从P L / S Q L块中运行它,如程序清单 2 9 - 5 所示。
清单29-5 TESTC2N1.SQL
—
从P L / S Q L 块测试c h a r _ t o _ n u m b e r()函数
第29章计使用存储子过程、包与提供的包计计473
下载
剩余25页未读,继续阅读
yihaodianzw
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页