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 attributes và methods 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.