龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

Oracle数据库中的OOP概念(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
修改和删除对象: 9i之前,当建立的对象类型,以及依赖于此类型的对象或表之后,就无法再修改此对象类型了(增加删除属性和成员函数)。唯一的办法是

修改和删除对象:

9i之前,当建立的对象类型,以及依赖于此类型的对象或表之后,就无法再修改此对象类型了(增加删除属性和成员函数)。唯一的办法是撤销所有以来,即删除依赖于此类型的对象或表。9i新特性,可以修改被以来的对象类型,成为类型演化。

有两种方法:INVALIDATE 和 CASCADE

INVALIDATE比如:desc person_table

改变person类型,增加新属性ssn

alter type person

add attribute ssn varchar2(11) INVALIDATE;

desc person (bug可能需要新开一个session)

INVALIDATE选项使的所有依赖于person类型的对象和表标记为INVALID,比如:

Desc person_table

需要手工验证person_table:

alter table person_table upgrade including data;

desc person_table

upgrade including data表示根据新类型,物理上更新现有的数据的结构,ssn 置为null。

也可以upgrade not including data,不更新原有数据的结构。Dml访问person实例数据的时候再更新。

Select * from person_table

CASCADE比如:

alter type person

add attribute dob date

cascade not including table data

/不用手工验证依赖此对象类型的表,由数据库自动验证。

Desc person

Desc person_table

因为not including table data,没有更新原有数据:

select * from person_table

删除类型:force

方法:即对象中的过程和函数,3种类型:

STATIC: 只能够在对象类型上调用,不专属于某个实例。

MEMBER: 专属于某个特定的实例

CONSTRUCTOR: 构造函数

create or replace

type employee as object(

name person,

empno number,

hiredate date,

sal number,

commission number,

member function total_compensation return number,

static function new(p_empno number,

p_person person) return employee)

/

desc employee

在类型主体实现这两个方法:

create or replace

type body employee as

member function total_compensation return number is

begin

return nvl(self.sal,0) + nvl(self.commission, 0);

end;

static function new(p_empno number,

p_person person) return employee is

begin

return employee(p_person,p_empno,sysdate,10000,null);

end;

end;

/

比较抽象数据类型的数据:

declare

l_employee1 employee;

l_employee2 employee;

begin

l_employee1 :=employee.new(12345,null);

l_employee2 :=employee.new(67890,null);

if l_employee1= l_employee2 then

dbms_output.line_put(“They are equal”);

end if;

end;

/

使用map指定具体比较哪些属性:

create or replace

type employee as object(

name person,

empno number,

hiredate date,

sal number,

commission number,

map member function convert return number)

/

create or replace

type body employee as

map member function convert return number is

begin

return self.empno;

end;

end;

/

再比较:

declare

l_employee1 employee;

l_employee2 employee;

begin

l_employee1 :=employee.new(12345,null);

l_employee2 :=employee.new(67890,null);

if l_employee1= l_employee2 then

dbms_output.line_put(“They are equal”);

end if;

if l_employee1> l_employee2 then

dbms_output.line_put(“employee1 is greater”);

end if;

if l_employee1< l_employee2 then

dbms_output.line_put(“employee2 is greater”);

end if;

end;

精彩图集

赞助商链接