PL/SQL入門--複雜對象類型

  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; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章