一、概述
對象是Oracle8i以上版本中的一個新的特性,對象實際是對一組數據和操作的封裝,對象的抽象就是類。在面向對象技術中,對象涉及到以下幾個重要的特性:
封裝性
通過對數據和操作的封裝,將用戶關心的數據和操作暴露出來作為接口,其他數據和操作則隱藏到對象內部,這樣便於用戶使用和維護。
繼承性
對象具有繼承性,通過這一特性可以增強程序的可擴展性,適合大型項目的開發。
多態性
同一操作在運行時刻有不同的對象來引用,則其執行結果是不一樣的。這一特性稱之為多態性。
正是因為面向對象的諸多優勢,Oracle公司在8.0版本以後就加入了對這一特性的全面支持,下來的部分重點講述在Oracle中的面向對象程序設計。
二、Oracle中的面向對象程序設計
既然對象具有這麼多的優點,那麼在Oracle數據庫如何引用它呢?Oracle中的對象定義分兩步進行:
首先定義對象類型。定義對象類型跟定義包類型完全一樣,即分為對象類型頭(或稱為對象規范,specification)和對象類型體(body)。對象類型頭包括了對象類型的屬性和方法的聲明,而對象類型體則包含了對象類型具體的實現。
例如,定義一個empObj對象類型,代碼如下:
create or replace type empObj as object (
emp_id number(5),
emp_name varchar2(20),
emp_salary number(4),
--object’s function
member function addsalary(ext_salary number) return varchar2,
);
--object's body
create or replace type body empObj as
member function addsalary
return varchar2 is
begin
emp_salary :=emp_salary +ext_salary ;
return to_char(emp_salary);
end addsalary;
end;
特別需要注意的是,如果對象沒有成員函數部分,那麼此對象類型的定義只有對象類型頭部分。
然後定義對象實例。定義了對象類型後就可以直接定義它的實例了,比如定義一個empObj實例對象,代碼如下:
v_empObj1 empObj;
經過這兩步之後就可以引用對象實例的屬性和方法了,引用符號為“.”,比如
v_empObj1.emp_id; //引用emp_id屬性
v_empObj1.addsalary(300); //引用addsalary方法
另外,在初始化無成員函數的對象時可以直接以構造函數的形式進行初始化,注意,這個時候不需顯式的定義構造函數。比如,初始化上面v_empObj1對象(假設無成員函數的情況下才能進行這種初始化操作), 代碼如下:
v_empObj1 empObj:=empObj(10005,’jack’,6500);
由於Oracle數據庫是關系型數據庫,其存儲數據是以二維表的形式進行的,而對象是對數據和操作進行封裝的一個實體,其存儲信息往往是多維信息,那麼對象在Oracle數據庫中的存儲是如何進行的呢?(這裡補充一點,PL/SQL程序塊中聲明的對象是臨時對象,在超出其作用區域後系統將自動收回其分配的資源,但是如果需要保存對象的信息,就必須將其存儲在數據庫中)
事實上,對象在Oracle數據庫中的存儲形式分為兩種:
1. 對象列。即可以將數據表中的列的數據類型定義為一個對象類型,這樣對象就可以存儲在數據列中了。比如定義一個表table1,其中emp列可以用來存儲對象。
create table table1
(
id number(2);
emp empObj;
);
2. 對象行。即可以創建一個對象表,其中每一列就表示對象中的一個屬性,這樣一條行記錄就是一個對象了。比如定義一個emp表如下:
create table emp
(
emp_id number(5);
emp_name varchar2(20);
emp_salary number(4);
);
這樣emp表的一個記錄就是一個empObj對象,插入一個表的操作就可以為:
insert into emp values (empObj(10006,'marry',5000));
注意,這裡表中列類型與對象的屬性類型應該一一對應,另外這樣存儲將忽略對象的成員函數的信息。