技术开发 频道

Oracle中的OOP概念

  修改和删除对象:

  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;

  /

0
相关文章