1. 程式人生 > >PL/SQL面向物件

PL/SQL面向物件

PL/SQL允許定義一個物件型別,這有助於在Oracle的資料庫中設計的面向物件。物件型別可以包裝複合型別。使用物件允許實現資料的具體結構現實世界中的物件和方法操作它。物件有屬性和方法。屬性是一個物件的屬性,並用於儲存物件的狀態;和方法被用於模擬其行為。

使用CREATE[OR REPLACE] TYPE語句中建立的物件。下面是一個例子,建立包含一些屬性的簡單的地址物件:

CREATEOR REPLACE TYPE address AS OBJECT
(house_no varchar2(10),
 street varchar2(30),
 city varchar2(20),
 state varchar2
(10), pincode varchar2(10));/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type created.

讓我們來建立一個多個客戶物件,包裝的屬性和方法,擁有面向物件的感覺:

CREATEOR REPLACE TYPE customer AS OBJECT
(code number(5),
 name varchar2(30),
 contact_no varchar2(12),
 addr address,
 member procedure display
);/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type created.

例項化物件

定義物件型別提供了一個藍圖物件。要使用這個物件,需要建立這個物件的例項。可以訪問屬性,使用例項名稱和接入操作符,如下物件的方法(.):

DECLARE
   residence address;BEGIN
   residence := address('103A','M.G.Road','Jaipur','Rajasthan','201301');
   dbms_output.put_line('House No: '|| residence.house_no);
   dbms_output.put_line('Street: '|| residence.street);
   dbms_output.put_line('City: '|| residence.city);
   dbms_output.put_line('State: '
|| residence.state); dbms_output.put_line('Pincode: '|| residence.pincode);END;/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

House No: 103A
Street: M.G.Road
City: Jaipur
State: Rajasthan
Pincode: 201301

PL/SQL procedure successfully completed.

成員方法

成員方法是用於操縱物件屬性。提供的成員方法的宣告,同時宣告的物件型別。物件主體限定的程式碼成員方法。使用CREATE TYPE BODY語句建立的物件體。

建構函式返回一個新的物件作為其值的功能。每個物件都有一個系統定義的構造方法。構造方法的名稱是相同的物件型別。例如:

residence := address('103A','M.G.Road','Jaipur','Rajasthan','201301');

比較方法被用於比較的物件。有兩種方法來比較物件:

  • 對映方法:對映方法它的值取決於屬性的值,以這樣的方式實現函式。例如,一個客戶物件,如果客戶程式碼是相同的兩個客戶,可以認為是相同的一個。所以這兩個物件之間的關係將取決於程式碼的值。

  • 順序方法:順序方法實現一些內部邏輯比較兩個物件。例如,對於矩形(rectangle)物件,如果其兩側都大,則表示矩形(rectangle)大於另一個矩形(rectangle)。

使用對映方法

讓我們試著去了解上面使用下面的矩形物件的概念:

CREATEOR REPLACE TYPE rectangle AS OBJECT
(length number,
 width number,
 member function enlarge( inc number)return rectangle,
 member procedure display,
 map member function measure return number
);/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type created.

建立型別體:

CREATEOR REPLACE TYPE BODY rectangle AS
   MEMBER FUNCTION enlarge(inc number)return rectangle ISBEGINreturn rectangle(self.length + inc, self.width + inc);END enlarge;

   MEMBER PROCEDURE display ISBEGIN
      dbms_output.put_line('Length: '|| length);
      dbms_output.put_line('Width: '|| width);END display;

   MAP MEMBER FUNCTION measure return number ISBEGINreturn(sqrt(length*length + width*width));END measure;END;/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type body created.

現在,使用矩形(rectangle)物件及其成員函式:

DECLARE
   r1 rectangle;
   r2 rectangle;
   r3 rectangle;
   inc_factor number :=5;BEGIN
   r1 := rectangle(3,4);
   r2 := rectangle(5,7);
   r3 := r1.enlarge(inc_factor);
   r3.display;IF(r1 > r2)THEN-- calling measure function
      r1.display;ELSE
      r2.display;ENDIF;END;/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Length: 8
Width: 9
Length: 5
Width: 7

PL/SQL procedure successfully completed.

使用順序的方法

現在,相同的效果可以使用順序方法來實現。讓我們用一個順序方法重新建立矩形(rectangle)物件:

CREATEOR REPLACE TYPE rectangle AS OBJECT
(length number,
 width number,
 member procedure display,order member function measure(r rectangle)return number
);/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type created.

建立型類體:

CREATEOR REPLACE TYPE BODY rectangle AS
   MEMBER PROCEDURE display ISBEGIN
      dbms_output.put_line('Length: '|| length);
      dbms_output.put_line('Width: '|| width);END display;ORDER MEMBER FUNCTION measure(r rectangle)return number ISBEGINIF(sqrt(self.length*self.length + self.width*self.width)> sqrt(r.length*r.length + r.width*r.width))thenreturn(1);ELSEreturn(-1);ENDIF;END measure;END;/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type body created.

使用矩形(rectangle)物件及其成員函式:

DECLARE
   r1 rectangle;
   r2 rectangle;BEGIN
   r1 := rectangle(23,44);
   r2 := rectangle(15,17);
   r1.display;
   r2.display;IF(r1 > r2)THEN-- calling measure function
      r1.display;ELSE
      r2.display;ENDIF;END;/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Length: 23
Width: 44
Length: 15
Width: 17
Length: 23
Width: 44

PL/SQL procedure successfully completed.

繼承PL/SQL物件:

PL/SQL允許從現有的基礎物件建立物件。為了實現繼承,基本物件應被宣告為NOT FINAL。預設值是FINAL。

下面的程式說明了繼承PL/SQL物件。讓我們建立一個名為TableTop,這是從Rectangle物件繼承。另一個物件是由基本矩形(rectangle)物件建立:

CREATEOR REPLACE TYPE rectangle AS OBJECT
(length number,
 width number,
 member function enlarge( inc number)return rectangle,NOT FINAL member procedure display)NOT FINAL
/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type created.

建立基本型別主體:

CREATEOR REPLACE TYPE BODY rectangle AS
   MEMBER FUNCTION enlarge(inc number)return rectangle ISBEGINreturn rectangle(self.length + inc, self.width + inc);END enlarge;

   MEMBER PROCEDURE display ISBEGIN
      dbms_output.put_line('Length: '|| length);
      dbms_output.put_line('Width: '|| width);END display;END;/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type body created.

建立 tabletop 子物件: 

CREATEOR REPLACE TYPE tabletop UNDER rectangle
(  
   material varchar2(20);
   OVERRIDING member procedure display
)/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type created.

創造型體的 tabletop 子物件 :

CREATEOR REPLACE TYPE BODY tabletop AS
OVERRIDING MEMBER PROCEDURE display ISBEGIN
   dbms_output.put_line('Length: '|| length);
   dbms_output.put_line('Width: '|| width);
   dbms_output.put_line('Material: '|| material);END display;/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type body created.

使用 tabletop 物件及其成員函式: 

DECLARE
   t1 tabletop;
   t2 tabletop;BEGIN
   t1:= tabletop(20,10,'Wood');
   t2 := tabletop(50,30,'Steel');
   t1.display;
   t2.display;END;/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Length: 20
Width: 10
Material: Wood
Length: 50
Width: 30
Material: Steel

PL/SQL procedure successfully completed.

PL/SQL抽象物件

NOT INSTANTIABLE 子句允許宣告一個抽象的物件。不能用一個抽象的物件因為它是抽象的; 必須要建立一個子型別或子型別,以物件使用其功能。

示例,

CREATEOR REPLACE TYPE rectangle AS OBJECT
(length number,
 width number,NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)NOT INSTANTIABLE NOT FINAL
/

當上述程式碼在SQL提示符執行時,它產生了以下結果:

Type created.

轉載自:https://www.yiibai.com/plsql/plsql_object_oriented.html#article-start