PL / SQL - Hướng đối tượng

Trong chương này, chúng ta sẽ thảo luận về PL / SQL hướng đối tượng. PL / SQL cho phép xác định một kiểu đối tượng, giúp thiết kế cơ sở dữ liệu hướng đối tượng trong Oracle. Một kiểu đối tượng cho phép bạn tạo các kiểu kết hợp. Sử dụng các đối tượng cho phép bạn triển khai các đối tượng trong thế giới thực với cấu trúc dữ liệu và phương pháp cụ thể để vận hành nó. Đối tượng có thuộc tính và phương thức. Thuộc tính là thuộc tính của một đối tượng và được sử dụng để lưu trữ trạng thái của đối tượng; và các phương pháp được sử dụng để mô hình hóa hành vi của nó.

Các đối tượng được tạo bằng cách sử dụng câu lệnh CREATE [OR REPLACE] TYPE. Sau đây là một ví dụ để tạo mộtaddress đối tượng bao gồm một số thuộc tính -

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

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type created.

Hãy tạo thêm một đối tượng nữa customer nơi chúng tôi sẽ quấn attributesmethods cùng nhau để có cảm giác hướng đối tượng -

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

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type created.

Khởi tạo một đối tượng

Việc xác định kiểu đối tượng cung cấp bản thiết kế cho đối tượng. Để sử dụng đối tượng này, bạn cần tạo các thể hiện của đối tượng này. Bạn có thể truy cập các thuộc tính và phương thức của đối tượng bằng cách sử dụng tên phiên bản vàthe access operator (.) như sau -

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; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

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

PL/SQL procedure successfully completed.

Phương thức thành viên

Member methods được sử dụng để điều khiển attributescủa đối tượng. Bạn cung cấp khai báo của một phương thức thành viên trong khi khai báo kiểu đối tượng. Phần thân đối tượng xác định mã cho các phương thức thành viên. Phần thân đối tượng được tạo bằng câu lệnh CREATE TYPE BODY.

Constructorslà các hàm trả về một đối tượng mới làm giá trị của nó. Mọi đối tượng đều có một phương thức khởi tạo do hệ thống xác định. Tên của hàm tạo giống như kiểu đối tượng. Ví dụ -

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

Các comparison methodsđược sử dụng để so sánh các đối tượng. Có hai cách để so sánh các đối tượng -

Phương pháp bản đồ

Các Map methodlà một hàm được triển khai theo cách mà giá trị của nó phụ thuộc vào giá trị của các thuộc tính. Ví dụ, đối với một đối tượng khách hàng, nếu mã khách hàng giống nhau cho hai khách hàng thì cả hai khách hàng có thể giống nhau. Vì vậy, mối quan hệ giữa hai đối tượng này sẽ phụ thuộc vào giá trị của mã.

Phương thức đặt hàng

Các Order methodthực hiện một số logic nội bộ để so sánh hai đối tượng. Ví dụ, đối với một đối tượng hình chữ nhật, một hình chữ nhật lớn hơn một hình chữ nhật khác nếu cả hai cạnh của nó lớn hơn.

Sử dụng phương pháp Bản đồ

Chúng ta hãy thử hiểu các khái niệm trên bằng cách sử dụng đối tượng hình chữ nhật sau:

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 
); 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type created.

Tạo phần thân kiểu -

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; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type body created.

Bây giờ sử dụng đối tượng hình chữ nhật và các hàm thành viên của nó -

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; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

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

PL/SQL procedure successfully completed.

Sử dụng phương thức đặt hàng

Bây giờ, same effect could be achieved using an order method. Hãy để chúng tôi tạo lại đối tượng hình chữ nhật bằng phương thức đặt hàng -

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

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type created.

Tạo phần thân kiểu -

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   ORDER MEMBER FUNCTION measure(r rectangle) return number IS 
   BEGIN 
      IF(sqrt(self.length*self.length + self.width*self.width)> 
         sqrt(r.length*r.length + r.width*r.width)) then 
         return(1); 
      ELSE 
         return(-1); 
      END IF; 
   END measure; 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type body created.

Sử dụng đối tượng hình chữ nhật và các hàm thành viên của nó -

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; 
   END IF; 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

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

PL/SQL procedure successfully completed.

Kế thừa cho các đối tượng PL / SQL

PL / SQL cho phép tạo đối tượng từ các đối tượng cơ sở hiện có. Để thực hiện kế thừa, các đối tượng cơ sở phải được khai báo làNOT FINAL. Mặc định làFINAL.

Các chương trình sau minh họa sự kế thừa trong PL / SQL Objects. Hãy để chúng tôi tạo một đối tượng khác có tênTableTop, điều này được kế thừa từ đối tượng Rectangle. Đối với điều này, chúng ta cần tạo đối tượng hình chữ nhật cơ sở -

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

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type created.

Tạo phần thân kiểu cơ sở -

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; 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type body created.

Tạo mặt bàn đối tượng con -

CREATE OR REPLACE TYPE tabletop UNDER rectangle 
(   
   material varchar2(20), 
   OVERRIDING member procedure display 
) 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type created.

Tạo phần thân kiểu cho mặt bàn đối tượng con

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

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type body created.

Sử dụng đối tượng tabletop và các hàm thành viên của nó -

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

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

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

PL/SQL procedure successfully completed.

Các đối tượng trừu tượng trong PL / SQL

Các NOT INSTANTIABLEmệnh đề cho phép bạn khai báo một đối tượng trừu tượng. Bạn không thể sử dụng một đối tượng trừu tượng như nó vốn có; bạn sẽ phải tạo một kiểu con hoặc kiểu con của các đối tượng như vậy để sử dụng các chức năng của nó.

Ví dụ,

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

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Type created.