1. 程式人生 > >基於Oracle的面向物件技術基礎簡析

基於Oracle的面向物件技術基礎簡析

一、概述

  物件是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));

  注意,這裡表中列型別與物件的屬性型別應該一一對應,另外這樣儲存將忽略物件的成員函式的資訊。



  三、物件操作與比較

  可以採用DML語句對物件進行操作,其操作的語法跟一般的資料型別完全一樣,比如在table1表中返回物件為empObj(10002,’mike’,3000)的記錄:

select * from table1 where emp=empObj(10002,"mike",3000);

  如果需要進行物件的大小比較,那麼用一般的方法就很難處理,畢竟物件含有一組屬性,無法進行組合比較。可以採用向物件加入map方法和order方法來解決此問題,前者是通過將物件某一屬性返回代表物件的值班來比較大小,後者是通過比較兩個物件之間某個屬性的值班來獲取物件的大小。由於兩者的相似性,這裡以用途更廣的map成員函式為為例示範如下:

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,
 map member function ID return number
);
--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;
--map function"s body
map member function ID return number is
begin
 return emp_id;
 end ID;
end;

  這樣定義了map函式後,對empObj物件大小的比較實質轉化為對各個物件的emp_id屬性大小的比較,在實際操作中,應該根據實際情況來返回關心的資料,以進行物件大小比較的操作。

  四、小結

  通過前面內容的介紹,大家應該對Oracle資料庫的面向物件的特性有一個初步的認識,充分利用Oracle的這一特性,可以將面向物件的重用性,可擴充套件性等優點引入到資料庫中,提高了資料庫的執行效能。