PL/SQL允許定義一個(gè)對(duì)象類型猩系,這有助于在Oracle的數(shù)據(jù)庫(kù)中設(shè)計(jì)的面向?qū)ο笱罢獭?duì)象類型可以包裝復(fù)合類型员寇。
創(chuàng)建對(duì)象:
CREATE OR REPLACE TYPE objName AS OBJECT
(
--定義對(duì)象類型屬性
var1 type,
var2 type,
var3 type,
...
-- 定義對(duì)象的成員方法安寺,可以訪問(wèn)對(duì)象本身的屬性
MEMBER FUNCTION fun_name1[(參數(shù)名 數(shù)據(jù)類型[,...])] return return_type,
MEMBER PROCEDURE proc_name1[(參數(shù)名 數(shù)據(jù)類型[,...])]
--靜態(tài)方法厕妖,不能訪問(wèn)對(duì)象本身的屬性,只能訪問(wèn)靜態(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
-- 實(shí)現(xiàn)對(duì)象成員方法
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;
實(shí)例化對(duì)象:
??要使用這個(gè)對(duì)象我衬,需要?jiǎng)?chuàng)建這個(gè)對(duì)象的實(shí)例叹放。每個(gè)對(duì)象都有一個(gè)系統(tǒng)定義的構(gòu)造方法饰恕,構(gòu)造方法的名稱是相同的對(duì)象類型挠羔。
DECLARE
residence objName; -- 定義對(duì)象類型
BEGIN
-- 初始化對(duì)象類型
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
-- 獲取對(duì)象類型的屬性進(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;
/
比較方法
比較方法被用于比較的對(duì)象。有兩種方法來(lái)比較對(duì)象:
- 映射方法:將對(duì)象實(shí)例映射為標(biāo)量數(shù)值(NUMBER埋嵌,DATE,VARCHAR2等),然后根據(jù)該標(biāo)量類型數(shù)據(jù)可以排序?qū)ο髮?shí)例破加。例如,一個(gè)客戶對(duì)象雹嗦,如果兩個(gè)客戶代碼是相同的范舀,可以認(rèn)為是相同的一個(gè)。所以這兩個(gè)對(duì)象之間的關(guān)系將取決于代碼的值了罪。
- 順序方法:實(shí)現(xiàn)一些內(nèi)部邏輯比較兩個(gè)對(duì)象锭环。
- 一個(gè)對(duì)象類型最多只能定義一個(gè)MAP/ORDER方法,并且MAP方法和ORDER方法不能同時(shí)使用泊藕。
- MAP方法可以在多個(gè)對(duì)象實(shí)例之間進(jìn)行排序,而ORDER方法只能比較兩個(gè)對(duì)象實(shí)例的大小
(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)在就可以通過(guò)isdn來(lái)比較兩個(gè)對(duì)象
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)在辅辩,相同的效果可以使用順序方法來(lái)實(shí)現(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對(duì)象
??PL/SQL允許從現(xiàn)有的基礎(chǔ)對(duì)象創(chuàng)建對(duì)象娃圆。為了實(shí)現(xiàn)繼承玫锋,基本對(duì)象應(yīng)被聲明為NOT FINAL。默認(rèn)值是FINAL讼呢。
基礎(chǔ)對(duì)象:
CREATE OR REPLACE TYPE baseObj AS OBJECT
(
var1 type,
var2 type,
MEMBER FUNCTION fu_name[(參數(shù)名 數(shù)據(jù)類型[,...])] return reu_type
)NOT FINAL; --指定該類可以被繼承撩鹿,如果指定FINAL,表示該類無(wú)法被繼承
子類對(duì)象:
CREATE OR REPLACE TYPE subObj UNDER baseObj
(
v1 type,
v2 type,
-- 聲明重寫(xiě)父類方法
OVERRIDING MEMBER FUNCTION fu_name[(參數(shù)名 數(shù)據(jù)類型[,...])]
)