Oracle存储过程中的面向对象特性



1. package的封装

Package提供了一种封装的机制,可以将存储过程、方法、定值、Type放在一起。这实际上应该是一种面向对象的思想。pck文件包括两部分:package 和package body。package中声明了可用的过程、方法,package body隐藏了实现的细节。

通过如上,我们即可以将位于数据库中的表记录数据看成是一个对象,而通过操作存储过程,实现对其的访问、修改。

举例,在商品交易数据中,实现对某日交易情况的清算,并记录到清算报表基础表中。
我们可以建立package mypck,对外提供公共方法:setDealDate, setDealType; getDealDate, getDealType;及genDealReport。package body中,实现了genDealReport,从交易数据表中select数据、加工、放置到清算报表基础表,这些内部的细节过程均被封装了起来。在调用时,只要 call mypck.genDealReport,即可实现报表基础数据的生成。其他方法也可以自行开发。

2. package内部,type的使用

type实际上就像class或容器一样。你可以在package内部自主定义type,并非常方便地使用它们。如:
type my_cares is record(
a number,
b number,
c number,
d varchar2(10)
);
定义好后,如要使用可以先声明再直接调用。
declare
the_care my_cares;
i number := 0;
begin
the_care.a := 1;
the_care.b := 2;
i := the_care.b;
dbms_output.put_line(‘value is ’ || the_care.d);
end;

在procedure之间传递参数时,通过传递type 类型的参数,对程序的结构、今后的调整维护,都非常方便。

3. package内的参数传递

我们可以在package内定义各式各样的类型,而且它们可以作为公共参数,当在存储过程之间传递时带来便捷,就像2中所述那样。更为主要的是,package允许定义“属性”变量,格式如:
<VariableName> <Datatype>;
这类似Java语法,并且通过在package或package body中声明,可以分别作为public和private的属性变量来使用!这些变量可以在package body begin后被初始化,并被package body中不同的存储过程、方法调用。如下例子演示了这一特性。

执行结果如下:
v_int =1
v_str =test
v_int =100
v_str =hundred
vs1.parm1 =0
vs1.valu1 =initial
vs.parm1 =2
vs.valu1 =updated

4. 其他资料

不同session执行package又是什么情况呢?这里只引用一下相关的资料。由于package的全局变量在数据库层次上并不可见,所以每个session都可以认为是一个被实例化了的package对象。在session级别上对全局变量执行的赋值操作并不会被其他session看到,很好地体现了数据的封装性。

而由于oracle的package并没有显式地创建实例,所以package的全局变量跟其他面向对象语言的类的属性还是有区别的。最显著的区别在于这里的全局变量不能作为属性值在其他procedure或者function中进行调用。如果希望达到这样的效果,可以通过在package中定义function来实现。这些function的写法,有些像Java中的getter 和 setter。


来源:http://hi.baidu.com/rebooo/item/28d8e69c9a1749c8b725313e

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值