Thứ Tư, 26 tháng 10, 2022

PL/SQL - Object Oriented

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ó. Các đối tượng có cá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ột đối tượng địa chỉ đơn giản 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 khách hàng đối tượng , nơi chúng ta sẽ kết hợp các thuộc tính và phương thức lại với 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 cá thể và toán tử truy cập (.) 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

Các phương thức thành viên được sử dụng để thao tác các thuộc tính củ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ách sử dụng câu lệnh CREATE TYPE BODY.

Các hàm tạo là 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 phương pháp so sánh đượ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 đồ

Phương thức Bản đồ là 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

Phương thức Order thự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ó đều 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ờ, hiệu quả tương tự có thể đạt được bằng cách sử dụng phương pháp đặt hàng . 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ở nên được khai báo là NOT FINAL . Mặc định là FINAL .

Các chương trình sau đây minh họa sự kế thừa trong PL/SQL Objects. Chúng ta hãy tạo một đối tượng khác có tên là TableTop , đối tượng 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

Mệnh đề NOT INSTANTIABLE 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.


=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
Oracle PL/SQL, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master