PL/SQL允許定義一個對象類型,這有助于在Oracle的數(shù)據(jù)庫中設計的面向?qū)ο?。對象類型可以包裝復合類型。使用對象允許實現(xiàn)數(shù)據(jù)的具體結(jié)構(gòu)現(xiàn)實世界中的對象和方法操作它。對象有屬性和方法。屬性是一個對象的屬性,并用于存儲對象的狀態(tài);和方法被用于模擬其行為。
使用CREATE[OR REPLACE] TYPE語句中創(chuàng)建的對象。下面是一個例子,創(chuàng)建包含一些屬性的簡單的地址對象:
CREATE OR REPLACE TYPE address AS OBJECT (house_no varchar2(10), street varchar2(30), city varchar2(20), state varchar2(10), pincode varchar2(10) ); /
當上述代碼在SQL提示符執(zhí)行時,它產(chǎn)生了以下結(jié)果:
Type created.
讓我們來創(chuàng)建一個多個客戶對象,包裝的屬性和方法,擁有面向?qū)ο蟮母杏X:
CREATE OR REPLACE TYPE customer AS OBJECT (code number(5), name varchar2(30), contact_no varchar2(12), addr address, member procedure display ); /
當上述代碼在SQL提示符執(zhí)行時,它產(chǎn)生了以下結(jié)果:
Type created.
定義對象類型提供了一個藍圖對象。要使用這個對象,需要創(chuàng)建這個對象的實例。可以訪問屬性,使用實例名稱和接入操作符,如下對象的方法(.):
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提示符執(zhí)行時,它產(chǎn)生了以下結(jié)果:
House No: 103A Street: M.G.Road City: Jaipur State: Rajasthan Pincode: 201301 PL/SQL procedure successfully completed.
成員方法是用于操縱對象屬性。提供的成員方法的聲明,同時聲明的對象類型。對象主體限定的代碼成員方法。使用CREATE TYPE BODY語句創(chuàng)建的對象體。
構(gòu)造函數(shù)返回一個新的對象作為其值的功能。每個對象都有一個系統(tǒng)定義的構(gòu)造方法。構(gòu)造方法的名稱是相同的對象類型。例如:
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
比較方法被用于比較的對象。有兩種方法來比較對象:
映射方法:映射方法它的值取決于屬性的值,以這樣的方式實現(xiàn)函數(shù)。例如,一個客戶對象,如果客戶代碼是相同的兩個客戶,可以認為是相同的一個。所以這兩個對象之間的關(guān)系將取決于代碼的值。
順序方法:順序方法實現(xiàn)一些內(nèi)部邏輯比較兩個對象。例如,對于矩形(rectangle)對象,如果其兩側(cè)都大,則表示矩形(rectangle)大于另一個矩形(rectangle)。
讓我們試著去了解上面使用下面的矩形對象的概念:
CREATE OR 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提示符執(zhí)行時,它產(chǎn)生了以下結(jié)果:
Type created.
創(chuàng)建類型體:
CREATE OR REPLACE TYPE BODY rectangle AS MEMBER FUNCTION enlarge(inc number) return rectangle IS BEGIN return rectangle(self.length + inc, self.width + inc); END enlarge; MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); END display; MAP MEMBER FUNCTION measure return number IS BEGIN return (sqrt(length*length + width*width)); END measure; END; /
當上述代碼在SQL提示符執(zhí)行時,它產(chǎn)生了以下結(jié)果:
Type body created.
現(xiàn)在,使用矩形(rectangle)對象及其成員函數(shù):
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; END IF; END; /
當上述代碼在SQL提示符執(zhí)行時,它產(chǎn)生了以下結(jié)果:
Length: 8 Width: 9 Length: 5 Width: 7 PL/SQL procedure successfully completed.
現(xiàn)在,相同的效果可以使用順序方法來實現(xiàn)。讓我們用一個順序方法重新創(chuàng)建矩形(rectangle)對象:
CREATE 上一篇:PL/SQL IF-THEN-ELSE語句下一篇:PL/SQL CONTINUE語句