12.建立和使用复杂对象类型

  复杂对象类型是指与其他对象类型具有关联关系的对象类型

  1.对象类型嵌套

  建立对象类型

  1. create or replace type addr_typ7 as object( 
  2.  
  3.     state varchar2(20),city varchar2(20), 
  4.  
  5.     street varchar2(50),zipcode varchar2(6), 
  6.  
  7.     member function get_addr return varchar2); 

  建立对象类型体实现该方法:

  1. create or replace type body addr_typ7 as 
  2.  
  3.     member function get_addr return varchar2 is 
  4.  
  5.     begin 
  6.  
  7.       return state||city||street; 
  8.  
  9.     end; 
  10.  
  11.   end; 

  建立对象类型(嵌套):

 

  1. create or replace type person_typ7 as object( 
  2.  
  3.   name varchar2(10),gender varchar2(2),birthdate date,address addr_typ7, 
  4.  
  5.   member function get_info return varchar2);  

 

  建立对象类型体:

  1. create or replace type body person_typ7 as 
  2.  
  3.     member fucntion get_info return varchar2 
  4.  
  5.     is 
  6.  
  7.     begin 
  8.  
  9.       return '姓名:'||name||',家庭住址:'||address.get_addr(); 
  10.  
  11.     end; 

  建立操纵对象表:

  1. create table employee_tab7( 
  2.  
  3.    eno number(6),person person_typ7,sal number(6,2),job varchar2(10)); 

  操纵对象表

  PLS/SQL块中为对象表插入数据

  1. begin 
  2.  
  3.    insert into employee_tab7(eno,sal,job,person) values(1,1500,'图书管理员',person_typ7('马丽','女','11-1月-76',addr_typ7('内蒙古','呼和浩特','囫囵路10','010010'))); 
  4.  
  5.    insert into employee_tab7(eno,sal,job,person) values(2,1500,'图书管理员',person_typ7('马丽','女','11-1月-76',addr_typ7('内蒙古','呼和浩特','囫囵路20','010010'))); 
  6.  
  7.  end; 

  在PL/SQL块中更新对象列数据

  1. declare 
  2.  
  3.    v_pserson person_typ7; 
  4.  
  5.  begin 
  6.  
  7.    select person into v_person from employee_tab7 where eno=&&no; 
  8.  
  9.    v_person.address.street:='&street'
  10.  
  11.    update employee_tab7 set person=v_person where eno=&no; 
  12.  
  13.  end; 

  PL/SQL块中检索对象列数据

  1. declare 
  2.  
  3.    v_person person_typ7; 
  4.  
  5.  begin 
  6.  
  7.    select person into v_person from employee_tab7 where eno=&no; 
  8.  
  9.    dbms_output.put_line(v_person.get_info); 
  10.  
  11.  end; 

  PL/SQL块中删除对象表数据 

  1. begin 
  2.  
  3.     delete from employee_tab7 where eno=&no; 
  4.  
  5.   end; 

  2.参照对象类型

  指在建立对象表时使用REF定义表列,REF实际是指向行对象数据的逻辑指针

  通过使用REF定义表列,可以使得一个对象表引用另一个对象表(行对象)的数据,从而节省磁盘空间和内存空间

  建立对象类型:

  1. create or replace type person_typ8 as object( 
  2.  
  3.    name varchar2(10),gender varchar2(2),birchdate date,address varchar2(50), 
  4.  
  5.    member function get_info return varchar2); 

  建立对象类型体:

  1. create or replace type body person_typ8 as 
  2.  
  3.    member function get_info return varchar2 
  4.  
  5.    is 
  6.  
  7.    begin 
  8.  
  9.      return '姓名:'||name||',家庭住址:'||address; 
  10.  
  11.    end; 
  12.  
  13.  end; 

  建立行对象并追加数据

  1. create table person_tab8 of person_typ8; 
  2.  
  3.    insert into person_tab8 values('马丽','女','11-1月-76','内蒙古呼和浩特10号'); 
  4.  
  5.    insert into person_tab8 values('王名','男','11-1月-76','内蒙古呼和浩特11号'); 

  对象表引用对象表(REF)

  建立对象表(引用表)

  1. create table employee_tab8( 
  2.  
  3.     eno number(6),person ref person_typ8,sal number(6,2),job varchar2(10)); 

  操纵对象表

  为对象表出入数据

  引用行对象表时,需要使用函数REF(),其返回值实际是指向相应数据行的指针

  1. begin 
  2.  
  3.     insert into employee_tab8 select 1,ref(a),2000,'图书管理员' from person_tab8 a where a.name = '马丽'
  4.  
  5.     insert into employee_tab8 select 1,ref(a),2000,'图书管理员' from person_tab8 a where a.name = '王名'
  6.  
  7.   end; 

  检索REF对象列数据

  为了取得行对象的相应数据,必须要使用DEREF函数取得REF列所对应的实际数据

  1. declare 
  2.  
  3.    v_person person_typ8; 
  4.  
  5.  begin 
  6.  
  7.    select deref(person) into v_person from employee_tab8 where eno=&no; 
  8.  
  9.    dbms_output.put_line(v_person.get_info); 
  10.  
  11.  end; 

  更新REF对象列数据

  要修改其列所引用的数据,就必须修改相应的行对象

  1. declare 
  2.  
  3.    v_person person_typ8; 
  4.  
  5.  begin 
  6.  
  7.    select deref(person) into v_person from employee_tab8 where eno=&no; 
  8.  
  9.    v_person.address:='&address'
  10.  
  11.    update person_tab8 set address=v_person.address where name=v_person.name; 
  12.  
  13.  end; 

  删除对象表数据

  1. begin 
  2.  
  3.     delete from employee_tab8 where eno=&no; 
  4.  
  5.   end; 

  3.对象类型继承

  指一个对象类型继承另一个对象类型,并且对象类型继承由父类型和子类型组成

  父类型用于定义不同对象类型的公用属性和方法,而子类型不仅继承了父类型的公用属性和方法,而且还可具有自己的私有属性和方法.

  使用对象类型继承时,在定义父类型时必须要指定NOT FINAL 选项,如果不指定该选项,默认为FINAL,表示该对象类型不能被继承

  建立父对象类型:

  1. create or replace type person_typ9 as object( 
  2.  
  3.    name varchar2(10),gender varchar2(2),birthdate date,address varchar2(50), 
  4.  
  5.    member function get_info return varchar2) not final; 

  建立对象类型体:

  1. create or replace type body person_typ9 as 
  2.  
  3.    member function get_info return varchar2 
  4.  
  5.    is 
  6.  
  7.    begin 
  8.  
  9.      return '姓名:'||name||',家庭住址:'||address; 
  10.  
  11.    end; 
  12.  
  13.  end; 

  建立子对象类型(继承):

  1. create or replace type employee_typ9 under person_typ9( 
  2.  
  3.   eno number(6),sal number(6,2),job varchar2(10), 
  4.  
  5.   member function get_other return varchar2); 

  建立对象类型体(私有方法):

  1. create or replace type body employee_typ9 as 
  2.  
  3.    member function get_other return varchar2 
  4.  
  5.    is 
  6.  
  7.    begin 
  8.  
  9.      return '雇员名称:'||name||',工资:'||sal; 
  10.  
  11.    end; 
  12.  
  13.  end; 

  建立对象表并插入数据

  1. sql>create table employee_tab9 of employee_typ9; 
  2.  
  3.  sql>insert into employee_tab9 values('马丽','女','01-11月-76','呼和浩特15号',2,2000,'高级钳工'); 
  4.  
  5.  sql>insert into employee_tab9 values('王名','男','01-11月-76','呼和浩特15号',2,2000,'高级钳工');    

  使用对象方法输出数据

  1. declare 
  2.  
  3.    v_employee employee_typ9; 
  4.  
  5.  begin 
  6.  
  7.    select value(a) into v_employee from employee_tab9 a where a.eno=&no; 
  8.  
  9.    dbms_output.put_line(v_employee.get_info); 
  10.  
  11.    dbms_output.put_line(v_employee.get_other); 
  12.  
  13.  end; 

  4.维护对象类型

  显示对象类型信息  执行CREATE TYPE 命令建立对象类型时,ORACLE会将对象类型的信息存放到数据字典中(USER_TYPES)

  1. select type_name,attributes,final from user_types; 
  2.  
  3.  desc person_typ1 

 

  增加和删除对象类型属性

 如果已经基于对象类型建立了对象类型或对象表,那么在对象类型增加或删除属性时必须要带有CASCADE关键字

  1. alter type preson_typ1 add attribute address varchar2(50) cascade 
  2.  
  3.  alter type person_typ1 drop attrbute birthdate cascade; 

  增加和删除对象类型方法

  1. alter type person_typ1 add member function get_info return varchar2 cascade; 
  2.  
  3.  create or replace type body person_typ1 as 
  4.  
  5.    member function get_info return varchar2 is 
  6.  
  7.    begin 
  8.  
  9.      return '雇员名:'||name||',家庭住址:'||address; 
  10.  
  11.    end; 
  12.  
  13.  end;