11.對象類型
1.1對象類型組件
對象類型包括屬性和方法.
1.2對象類型和對象實例
對象實例OBJECT INSTANCE是對象類型的具體實現,對應於現實世界的具體對象
1.3構造對象類型
對象類型包括對象類型規範和對象類型體兩部分
1.4對象類型屬性
必須要提供屬性名和數據類型
對象類型屬性不能使用以下數據類型:LONG,LONG RAW,ROWID,UROWID,PL/SQL特有類型,不能指定對象屬性的默認值,也不能指定NOT NULL選項
1.5對象類型方法
用於描述對象所要執行的操作
定義方法:可以定義構造方法,MEMBER方法,STATIC方法,MAP方法以及ORDER方法
1)構造方法CONSTRUCT METHOD:
用於初始化對象並返回對象實例,類似於JAVA語言的構造方法
構造方法是與對象類型同名的函數,其默認參數是對象類型的所有屬性
2)MEMBER方法
用於訪問對象實例的數據
當使用MEMBER方法時,可以使用內置參數SELF訪問當前對象實例
只能由對象實例調用,而不能由對象類型調用.
object_type_instance.method();
3)STATIC方法:
用於訪問對象類型,在對象類型上執行全局操作,而不需要訪問特定對象實例的數據
只能由對象類型調用,而不能由對象實例調用
4)MAP方法:
是對象類型的一種可選方法,可以將對象實例影射爲標量類型數據(DATE,NUMBER,VARCHAR2),然後根據該標量類型數據可以排序對象實例,對象類型最多隻能定義一個MAP方法
5)ORDER方法:
MAP方法可以在多個對象實例之間進行排序,而ORDER方法只能比較兩個對象實例的大小.
定義對象類型時,最多隻能定義一個ORDER方法
MAP方法和ORDER方法不能同時定義,如果不需要比較對象實例,則不需要定義MAP和ORDER方法
2.對象表OBJECT TABLE
指包含對象類型列的表,對象表至少會包含一個對象類型列.
ORACLE包含行對象和列對象兩種對象表
行對象是指直接基於對象類型所建立的表,而列對象則是包含多個列的對象表
行對象:create table employee of employee_type;
列對象:create table department(
dno number,dname varchar2(10),
employee employee_type);
3.對象類型繼承:TYPE INHERITANCE
指一個對象類型繼承另一個對象類型
4.REF數據類型
REF是指向行對象的邏輯指針,是ORACLE的一種內置數據類型
建表時通過使用REF引用行對象,可以使不同表共享相同對象,從而降低內存佔用.
ref table department(dno number(2),dname varchar2(10),emp ref employee_type);
11.2建立和使用簡單對象類型
建立對象類型規範的語法:
- create or replace type type_name as object(
- attribute1 datatype[,attribute2 datatype,...],
- [member|static method1 spec,member|static method2 spec,..]);
建立對象類型體的語法:
- create or replace type body type_name as
- member|static method1 body;
- member|static method2 body;
- ....]
1.建立和使用不包含任何方法的對象類型
對象類型可以不包含任何方法
- create or replace type person_type1 as object(
- name varchar2(10),gender varchar2(2),birthdate date);
1.1建立行對象
行對象是指直接基於對象類型所建立的表
- create table person_tab1 of person_typ1;
爲行對象插入數據
- begin
- insert into person_tab1 values('馬麗','女','11-1月-76');
- insert into person_tab2 values(person_type1('王名','男','11-12月-76);
- end;
檢索行對象數據
必須要使用函數VALUE取得行對象數據,並檢索到對象類型變量中
- declare
- person person_typ1;
- begin
- select value(p) into person from person_tab1 p where p.name='&name';
- dbms_output.put_line('性別:'||person.gender);
- dbms_output.put_line('出生日期:'||person.birthdate);
- end;
更新行對象數據
如果按照對象屬性更新數據,則必須要爲行對象定義別名.
- begin
- update person_tab1 p set p.birthdate='11-2月-76' where p.name='馬麗';
- end;
刪除行對象數據
如果按照對象屬性刪除數據,則必須要爲行對象定義別名
- begin
- delete from person_tab1 p where p.name='馬麗';
- end;
1.2建立列對象
- create table employee_tab1(
- eno number(6),person person_typ1,sal number(6,2),job varchar2(10));
爲列對象employee_tab1插入數據
- begin
- insert into empoyee_tab1(eno,sal,job,person) value1,2000,'高級鉗工',person_typ1('王名','男','11-1月-76');
- end;
檢索對象類型列的數據
檢索列對象的對象類型列數據時可以直接將對象實例數據檢索到對象類型變量中
- declare
- employee person_typ1;
- salary number(6,2);
- begin
- select person,sal into employee,salary from employee_tab1 where eno=&no;
- dbms_output.put_line('僱員名:'||employee.name);
- dbms_output.put_line('僱員工資:'||salary);
- end;
更新對象列數據
更新列對象的對象列數據時必須要爲列對象定義別名,並且引用對象屬性(列對象別名.對象類型列名.對象屬性名)
- begin
- update employee_tab p set p.person.birthdate='&newdate' where p.person.name='&name';
- end;
依據對象屬性刪除數據
依據對象屬性刪除列數據時必須要爲對象表定義別名,並且引用對象屬性(列對象別名.對象類型列名.對象屬性名)
2.建立和使用包含MEMBER方法的對象類型
MEMBER方法用於訪問對象實例的數據,如果在對象類型中需要訪問特定對象實例的數據,則必須要定義MEMBER方法.
MEMBER方法只能由對象實例調用,而不能由對象類型調用.
- create or replace type person_typ2 as object(
- name varchar2(10),gender varchar2(2),biethdate date,address varchar2(100),
- member procedure change_address(new_addr varchar2),
- member function get_info feturn varchar2);
在建立類型規範時定義了MEMBER方法,所以必須要通過對象類型體實現這些方法.
- create or replace type body person_typ2 is
- member procedure change address(new_addr varchar2)
- is
- begin
- address:=new_addr;
- end;
- member function get_info return varchar2
- is
- v_info varchar2(100);
- begin
- v_info:='姓名'||name||',出生日期:'||birthdate;
- return v_info;
- end;
- end;
使用對象類型
- create table employee_tab2(
- eno number(6),person person_typ2,sal number(6,2),job varchar2(10));
- insert into employee_tab2(eno,sal,job,person) vaules(1,2000,''高級焊工',person_typ2('王名','男','11-1月-76','福州市'));
- insert into employee_tab2(eno,sal,job,person) values(2,1500,'質量檢查員',person_typ2('馬麗','女','11-1月-76','福州市'));
調用對象方法
- declare
- v_person person_typ2;
- begin
- select person into v_person from employee_tab2 where eno=&&no;
- v_person.change_address('福清');
- update employee_tab2 set person=v_person where eno=&no;
- dbms_output.put_line(v_person.get_info);
- end;
3.建立和使用包含STATIC方法的對象類型
static方法用於訪問對象類型,在對象類型上執行全局操作
STATIC方法只能由對象類型訪問,不能由對象實例訪問
建立類型規範:
- create or replace type person_typ3 as object(
- name varchar2(10),gender varchar2(2),
- birthdate date,regdate date,
- static function getdate return date,
- member function get_info return varchar2);
建立對象類型體:
- create or replace type body person_typ3 is
- static function getdate return date is
- begin
- return sysdate;
- end;
- member function get_info return varchar2
- is
- begin
- return '姓名:'||name||',註冊日期:'||regdate;
- end;
- end;
使用對象類型及其STATIC方法和MEMBER方法
- create table employee_tab3(
- eno number(6),person person_typ3,sal number(6,2),job varchar2(10));
在對象類型上使用STATIC方法:對象類型調用
- begin
- insert into employee_tab3(eno,sal,job,person) values(&no,&salary,'&title',person_typ3("&name','&sex','&birthdate',person_typ3.getdate()));
使用MEMBER方法:實例對象調用
- declare
- v_person person_typ3;
- begin
- select person into v_person from employee_tab3 where eno=&no;
- dbms_output.put_line(v_person.get_info());
- end;
4.建立和使用包含MAP方法的對象類型
MAP方法用於將對象實例映射爲標量數值(NUMBER,DATE,VARCAHR2等)
爲了排序多個對象實例的是數據,可以在建立對象類型時定義MAP方法
一個對象類型最多隻能定義一個MAP方法,並且MAP方法和ORDER方法不能同時使用
建立對象類型規範:
- create or replace type person_typ4 as object(
- name varchar2(10),gender varchar2(2),birthdate date,
- map member function getage return varchar2);
建立對象類型體
- create or replace type body person_typ4 is
- map member function getage return varchar2
- is
- begin
- return trunc((sysdate-birthdate)/365);
- end;
- end;
使用對象類型和方法:
- create table employee_tab4(
- eno number(6),person person_typ4,sal number(6,2),job varchar2(10));
- insert into employee_tab4(eno,sal,job,person) values (1,1500,'圖書管理員',person_typ4('馬麗','女','11-1月-76'));
- insert into employee_tab4(eno,sal,job,person) values (2,1500,'圖書管理員',person_typ4('馬麗','女','11-1月-76'));
- insert into employee_tab4(eno,sal,job,person) values (3,1500,'圖書管理員',person_typ4('馬麗','女','11-1月-76'));
使用MAP方法getage比較對象實例的方法
- declare
- type person_table_type is table of person_typ4;
- person_table person_table_type;
- v_temp varchar2(100);
- begin
- select person bulk collect into person_table from employee_tab4;
- if person_table(1).getage()>person_table(2).getage() then
- v_temp:=preson_table(1).name||'比'||person_table(2).name||'大';
- else
- v_temp:=preson_table(1).name||'比'||person_table(2).name||'小';
- end if;
- dbms_output.put_line(v_temp);
- end;
5.建立和使用包含ORDER方法的對象類型
order方法用於比較兩個對象實例的大小.
一個對象類型最多隻能包含一個ORDER方法,並且OREDER方法不能與MAP方法同時使用
建立對象類型規範:
- create or replace type person_typ5 as object(
- name varchar2(10),gender varchar2(2),birthdate date,
- order member functon compare( p person_typ5) return int);
建立對象類型體:
- create or replace type body person_typ5 is
- order member function compare(p person_typ5) return int
- is
- begin
- case
- when birthdate>p.birthdate then return 1;
- when birthdate=p.birthdate then return 0;
- when birthdate<p.birthdate then return -1;
- end case;
- end;
- end;
使用對象類型及其方法
- create table employee_tab5(
- eno number(6),person person_typ5,sal number(6,2),job varchar2(10));
- insert into employee_tab5(eno,sal,job,person) values(1,1500,'圖書管理員',person_typ5('馬麗','女','11-1月-76));
- insert into employee_tab5(eno,sal,job,person) values(2,1500,'圖書管理員',person_typ5('馬麗','女','11-1月-76));
使用ORDER方法比較不同對象實例的數據
- declare
- type person_table is table of person_typ5;
- person_table person_table_type;
- v_temp varchar2(100);
- begin
- select person bulk collect into person_table from employee_tab5;
- if person_table(1),compare(person_table(2))=1 then
- v_temp:=person_table(1).name||'比'||person_table(2).name||'大';
- else
- v_temp:=person_table(1).name||'比'||person_table(2).name||'小';
- end if;
- dbms_output.put_line(v_temp);
- end;
6.建立和使用自定義構造方法的對象類型
當自定義構造方法時,構造方法的名稱必須要與對象類型的名稱完全相同,並且必須要使用CONSTRUCTOR FUNCTION關鍵字定義構造方法
建立對象類型以及構造方法:
- create or replace type person_typ6o as object(
- name varchar2(10),gender varchar2(2),birthdate date,
- constructor function person_typ6(name varchar2) return selfas result,
- constructor function person_typ6(name varchar2,gender varchar2) return self as result,
- constructor function person_typ6(name varchar2,gender varchar2,birthdate date) return self as result);
建立對象類型體實現其構造方法:
- create or replace type body person_typ6 is
- constructor function person_typ6(name varchar2) return self as result
- is
- begin
- self.name:=name;
- self.gender:='女';
- self.birthdate:=sysdate;
- return;
- end;
- constructor function person_typ6(name varchar2,gender varchar2) return self as result
- is
- begin
- self.name:=name;
- self.gender:=gender;
- self.birthdate:=sysdate;
- return;
- end;
- constructor function person_typ6(name varchar2,gender varchar2,birthdate date) return self as result
- is
- begin
- self.name:=name;
- self.gender:=gender;
- self.birthdate:=birthdate;
- return;
- end;
- end;
使用各種構造方法爲其插入數據:
- create table employee_tab6(eno number(6),person person_typ6,sal number(6,2),job varchar2(10));
- insert into employee_tab6(eno,sal,job,person) values(1,1500,'圖書管理員',person_typ6('馬麗'));
- insert into employee_tab6(eno,sal,job,person) values(1,1500,'圖書管理員',person_typ6('馬麗','男'));
- insert into employee_tab6(eno,sal,job,person) values(1,1500,'圖書管理員',person_typ6('馬麗'.'男','11-1月-76'));
感謝April-Myhou,侯老師!