12.建立和使用複雜對象類型
複雜對象類型是指與其他對象類型具有關聯關係的對象類型
1.對象類型嵌套
建立對象類型
- create or replace type addr_typ7 as object(
- state varchar2(20),city varchar2(20),
- street varchar2(50),zipcode varchar2(6),
- member function get_addr return varchar2);
建立對象類型體實現該方法:
- create or replace type body addr_typ7 as
- member function get_addr return varchar2 is
- begin
- return state||city||street;
- end;
- end;
建立對象類型(嵌套):
- create or replace type person_typ7 as object(
- name varchar2(10),gender varchar2(2),birthdate date,address addr_typ7,
- member function get_info return varchar2);
建立對象類型體:
- create or replace type body person_typ7 as
- member fucntion get_info return varchar2
- is
- begin
- return '姓名:'||name||',家庭住址:'||address.get_addr();
- end;
建立操縱對象表:
- create table employee_tab7(
- eno number(6),person person_typ7,sal number(6,2),job varchar2(10));
操縱對象表
在PLS/SQL塊中爲對象表插入數據
- begin
- insert into employee_tab7(eno,sal,job,person) values(1,1500,'圖書管理員',person_typ7('馬麗','女','11-1月-76',addr_typ7('內蒙古','呼和浩特','囫圇路10','010010')));
- insert into employee_tab7(eno,sal,job,person) values(2,1500,'圖書管理員',person_typ7('馬麗','女','11-1月-76',addr_typ7('內蒙古','呼和浩特','囫圇路20','010010')));
- end;
在PL/SQL塊中更新對象列數據
- declare
- v_pserson person_typ7;
- begin
- select person into v_person from employee_tab7 where eno=&&no;
- v_person.address.street:='&street';
- update employee_tab7 set person=v_person where eno=&no;
- end;
在PL/SQL塊中檢索對象列數據
- declare
- v_person person_typ7;
- begin
- select person into v_person from employee_tab7 where eno=&no;
- dbms_output.put_line(v_person.get_info);
- end;
在PL/SQL塊中刪除對象表數據
- begin
- delete from employee_tab7 where eno=&no;
- end;
2.參照對象類型
指在建立對象表時使用REF定義表列,REF實際是指向行對象數據的邏輯指針
通過使用REF定義表列,可以使得一個對象表引用另一個對象表(行對象)的數據,從而節省磁盤空間和內存空間
建立對象類型:
- create or replace type person_typ8 as object(
- name varchar2(10),gender varchar2(2),birchdate date,address varchar2(50),
- member function get_info return varchar2);
建立對象類型體:
- create or replace type body person_typ8 as
- member function get_info return varchar2
- is
- begin
- return '姓名:'||name||',家庭住址:'||address;
- end;
- end;
建立行對象並追加數據
- create table person_tab8 of person_typ8;
- insert into person_tab8 values('馬麗','女','11-1月-76','內蒙古呼和浩特10號');
- insert into person_tab8 values('王名','男','11-1月-76','內蒙古呼和浩特11號');
對象表引用對象表(REF)
建立對象表(引用表)
- create table employee_tab8(
- eno number(6),person ref person_typ8,sal number(6,2),job varchar2(10));
操縱對象表
爲對象表出入數據
引用行對象表時,需要使用函數REF(),其返回值實際是指向相應數據行的指針
- begin
- insert into employee_tab8 select 1,ref(a),2000,'圖書管理員' from person_tab8 a where a.name = '馬麗';
- insert into employee_tab8 select 1,ref(a),2000,'圖書管理員' from person_tab8 a where a.name = '王名';
- end;
檢索REF對象列數據
爲了取得行對象的相應數據,必須要使用DEREF函數取得REF列所對應的實際數據
- declare
- v_person person_typ8;
- begin
- select deref(person) into v_person from employee_tab8 where eno=&no;
- dbms_output.put_line(v_person.get_info);
- end;
更新REF對象列數據
要修改其列所引用的數據,就必須修改相應的行對象
- declare
- v_person person_typ8;
- begin
- select deref(person) into v_person from employee_tab8 where eno=&no;
- v_person.address:='&address';
- update person_tab8 set address=v_person.address where name=v_person.name;
- end;
刪除對象表數據
- begin
- delete from employee_tab8 where eno=&no;
- end;
3.對象類型繼承
指一個對象類型繼承另一個對象類型,並且對象類型繼承由父類型和子類型組成
父類型用於定義不同對象類型的公用屬性和方法,而子類型不僅繼承了父類型的公用屬性和方法,而且還可具有自己的私有屬性和方法.
使用對象類型繼承時,在定義父類型時必須要指定NOT FINAL 選項,如果不指定該選項,默認爲FINAL,表示該對象類型不能被繼承
建立父對象類型:
- create or replace type person_typ9 as object(
- name varchar2(10),gender varchar2(2),birthdate date,address varchar2(50),
- member function get_info return varchar2) not final;
建立對象類型體:
- create or replace type body person_typ9 as
- member function get_info return varchar2
- is
- begin
- return '姓名:'||name||',家庭住址:'||address;
- end;
- end;
建立子對象類型(繼承):
- create or replace type employee_typ9 under person_typ9(
- eno number(6),sal number(6,2),job varchar2(10),
- member function get_other return varchar2);
建立對象類型體(私有方法):
- create or replace type body employee_typ9 as
- member function get_other return varchar2
- is
- begin
- return '僱員名稱:'||name||',工資:'||sal;
- end;
- end;
建立對象表並插入數據
- sql>create table employee_tab9 of employee_typ9;
- sql>insert into employee_tab9 values('馬麗','女','01-11月-76','呼和浩特15號',2,2000,'高級鉗工');
- sql>insert into employee_tab9 values('王名','男','01-11月-76','呼和浩特15號',2,2000,'高級鉗工');
使用對象方法輸出數據
- declare
- v_employee employee_typ9;
- begin
- select value(a) into v_employee from employee_tab9 a where a.eno=&no;
- dbms_output.put_line(v_employee.get_info);
- dbms_output.put_line(v_employee.get_other);
- end;
4.維護對象類型
顯示對象類型信息 執行CREATE TYPE 命令建立對象類型時,ORACLE會將對象類型的信息存放到數據字典中(USER_TYPES)
- select type_name,attributes,final from user_types;
- desc person_typ1
增加和刪除對象類型屬性
如果已經基於對象類型建立了對象類型或對象表,那麼在對象類型增加或刪除屬性時必須要帶有CASCADE關鍵字
- alter type preson_typ1 add attribute address varchar2(50) cascade
- alter type person_typ1 drop attrbute birthdate cascade;
增加和刪除對象類型方法
- alter type person_typ1 add member function get_info return varchar2 cascade;
- create or replace type body person_typ1 as
- member function get_info return varchar2 is
- begin
- return '僱員名:'||name||',家庭住址:'||address;
- end;
- end;