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