Oracle数据库中的OOP概念(1)(2)
修改和删除对象:
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;
- 上一篇:磁盘排序对Oracle数据库性能的影响(1)
- 下一篇:ASM数据库自动存储管理浅析



