Oracle對象類型

PL/SQL允許定義一個對象類型,這有助于在Oracle的數(shù)據(jù)庫中設(shè)計的面向?qū)ο?。對象類型可以包裝復(fù)合類型。

創(chuàng)建對象:

CREATE OR REPLACE TYPE objName AS OBJECT
(
 --定義對象類型屬性  
 var1 type,
 var2 type,
 var3 type,
 ...
 -- 定義對象的成員方法,可以訪問對象本身的屬性
 MEMBER FUNCTION fun_name1[(參數(shù)名 數(shù)據(jù)類型[,...])] return return_type,
 MEMBER PROCEDURE proc_name1[(參數(shù)名 數(shù)據(jù)類型[,...])]

--靜態(tài)方法,不能訪問對象本身的屬性,只能訪問靜態(tài)數(shù)據(jù) 
 STATIC FUNCTION fun_name2[(參數(shù)名 數(shù)據(jù)類型[,...])] return return_type,
 STATIC PROCEDURE proc_name2[(參數(shù)名 數(shù)據(jù)類型[,...])]
);

創(chuàng)建類型體:

CREATE OR REPLACE TYPE BODY objName AS
   -- 實現(xiàn)對象成員方法
   MEMBER FUNCTION fun_name1[(參數(shù)名 數(shù)據(jù)類型[,...])] 
   RETURN return_type
   AS
   BEGIN
      <function_body>
   END fun_name1;

   MEMBER proc_name1[(參數(shù)名 數(shù)據(jù)類型[,...])] 
   AS
   BEGIN
      <procedure_body>
   END proc_name1;

   STATIC FUNCTION fun_name2[(參數(shù)名 數(shù)據(jù)類型[,...])] 
   RETURN return_type
   AS
   BEGIN
      <function_body>
   END fun_name2;

   STATIC proc_name2[(參數(shù)名 數(shù)據(jù)類型[,...])] 
   AS
   BEGIN
      <procedure_body>
   END proc_name2;
END;

實例化對象:
??要使用這個對象,需要創(chuàng)建這個對象的實例。每個對象都有一個系統(tǒng)定義的構(gòu)造方法,構(gòu)造方法的名稱是相同的對象類型。

DECLARE
   residence objName; -- 定義對象類型
BEGIN
   -- 初始化對象類型
   residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
   -- 獲取對象類型的屬性進(jìn)行顯示 
   dbms_output.put_line('House No: '|| residence.house_no);
   dbms_output.put_line('Street: '|| residence.street);
   dbms_output.put_line('City: '|| residence.city);
END;
/

比較方法
比較方法被用于比較的對象。有兩種方法來比較對象:

  • 映射方法:將對象實例映射為標(biāo)量數(shù)值(NUMBER,DATE,VARCHAR2等),然后根據(jù)該標(biāo)量類型數(shù)據(jù)可以排序?qū)ο髮嵗@?,一個客戶對象,如果兩個客戶代碼是相同的,可以認(rèn)為是相同的一個。所以這兩個對象之間的關(guān)系將取決于代碼的值。
  • 順序方法:實現(xiàn)一些內(nèi)部邏輯比較兩個對象。
  • 一個對象類型最多只能定義一個MAP/ORDER方法,并且MAP方法和ORDER方法不能同時使用。
  • MAP方法可以在多個對象實例之間進(jìn)行排序,而ORDER方法只能比較兩個對象實例的大小

(1)映射方法

CREATE OR REPLACE TYPE book_obj AS OBJECT (
   isbn        CHAR (10),
   title       VARCHAR2 (100),
   num_pages   NUMBER,
   MAP MEMBER FUNCTION return_isbn RETURN CHAR
);

CREATE OR REPLACE TYPE BODY book_obj
AS
  MAP MEMBER FUNCTION return_isbn RETURN CHAR AS
   BEGIN
      RETURN SELF.isbn;
   END return_isbn;
END;

--現(xiàn)在就可以通過isdn來比較兩個對象
DECLARE
    v_book1   book := book ('72121203', 'Oracle DBA 101', 563);
    v_book2   book := book ('72122048', 'Oracle 8i: A Beginner''s Guide', 765);

 BEGIN
    IF v_book1 < v_book2 THEN
       DBMS_OUTPUT.put_line (v_book1.title || ' < ' || v_book2.title);
    ELSIF v_book1 = v_book2 THEN
       DBMS_OUTPUT.put_line (v_book1.title || ' = ' || v_book2.title);
    ELSE
       DBMS_OUTPUT.put_line (v_book1.title || ' > ' || v_book2.title);
    END IF;
 END;

(2)使用順序的方法
現(xiàn)在,相同的效果可以使用順序方法來實現(xiàn)。

CREATE OR REPLACE TYPE book_obj AS OBJECT (
   isbn        CHAR (10),
   title       VARCHAR2 (100),
   num_pages   NUMBER,
   ORDER MEMBER FUNCTION compare_book (p_isbn IN BOOK_OBJ) RETURN CHAR
);

CREATE OR REPLACE TYPE BODY book_obj
AS
   ORDER MEMBER FUNCTION compare_book (p_isbn IN BOOK_OBJ) RETURN NUMBER AS
   BEGIN
      IF p_isbn.isbn < SELF.isbn THEN
         RETURN 1;
      ELSIF p_isbn.isbn > SELF.isbn THEN
         RETURN -1;
      ELSE
         RETURN 0;
      END IF;
   END compare_book;
END;
 DECLARE
    v_book1   book := book ('72121203', 'Oracle DBA 101', 563);
    v_book2   book := book ('72122048', 'Oracle 8i: A Beginner''s Guide', 765);
 BEGIN
    IF v_book1 < v_book2 THEN
       DBMS_OUTPUT.put_line (v_book1.title || ' < ' || v_book2.title);
    ELSIF v_book1 = v_book2 THEN
       DBMS_OUTPUT.put_line (v_book1.title || ' = ' || v_book2.title);
    ELSE
       DBMS_OUTPUT.put_line (v_book1.title || ' > ' || v_book2.title);
    END IF;
 END;

繼承PL/SQL對象
??PL/SQL允許從現(xiàn)有的基礎(chǔ)對象創(chuàng)建對象。為了實現(xiàn)繼承,基本對象應(yīng)被聲明為NOT FINAL。默認(rèn)值是FINAL。

基礎(chǔ)對象:

CREATE OR REPLACE TYPE baseObj AS OBJECT
(
  var1 type,
  var2 type,
  MEMBER FUNCTION fu_name[(參數(shù)名 數(shù)據(jù)類型[,...])] return reu_type
)NOT FINAL; --指定該類可以被繼承,如果指定FINAL,表示該類無法被繼承 

子類對象:

CREATE OR REPLACE TYPE subObj UNDER baseObj 
(  
   v1 type,
   v2 type,
   -- 聲明重寫父類方法
   OVERRIDING MEMBER FUNCTION fu_name[(參數(shù)名 數(shù)據(jù)類型[,...])] 
)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容