Loại đối tượng trong PL / SQL là gì?
Lập trình hướng đối tượng đặc biệt thích hợp để xây dựng các thành phần có thể tái sử dụng và các ứng dụng phức tạp. Chúng được tổ chức xung quanh "đối tượng" chứ không phải "hành động" tức là các chương trình được thiết kế để hoạt động và tương tác với toàn bộ đối tượng hơn là hành động đơn lẻ. Khái niệm này cho phép người lập trình điền và thao tác các chi tiết ở cấp thực thể đối tượng.
Hình ảnh dưới đây mô tả một ví dụ về loại đối tượng trong đó tài khoản ngân hàng được coi là một thực thể đối tượng. Các thuộc tính đối tượng bao gồm những thứ đang giữ một số giá trị thuộc tính, ví dụ như trong Tài khoản Ngân hàng; nó là Số tài khoản, số dư ngân hàng, v.v. trong khi các phương pháp đối tượng mô tả những thứ như tính lãi suất, tạo bảng sao kê ngân hàng, v.v. đòi hỏi phải hoàn thành một số quy trình nhất định.
Trong PL / SQL lập trình hướng đối tượng dựa trên các kiểu đối tượng.
Một kiểu đối tượng có thể đại diện cho bất kỳ thực thể nào trong thế giới thực. Chúng ta sẽ thảo luận thêm về các kiểu đối tượng trong chương này.
Trong hướng dẫn này - bạn sẽ học,
- Các thành phần của các loại đối tượng
- Tạo đối tượng trong Oracle
- Khai báo Khởi tạo Loại Đối tượng
- Người xây dựng
- Kế thừa trong loại đối tượng
- Bình đẳng của các đối tượng PL / SQL
Các thành phần của các loại đối tượng
Kiểu đối tượng PL / SQL chủ yếu chứa hai thành phần.
- Thuộc tính
- Thành viên / Phương pháp
Thuộc tính
Thuộc tính là cột hoặc trường mà dữ liệu được lưu trữ. Mỗi thuộc tính sẽ được ánh xạ tới kiểu dữ liệu xác định kiểu xử lý và lưu trữ cho thuộc tính đó. Thuộc tính có thể thuộc bất kỳ kiểu dữ liệu PL / SQL hợp lệ nào hoặc có thể thuộc một kiểu đối tượng khác.
Thành viên / Phương pháp
Thành viên hoặc Phương thức là chương trình con được định nghĩa trong kiểu đối tượng. Chúng không được sử dụng để lưu trữ bất kỳ dữ liệu nào. Chúng chủ yếu được sử dụng để xác định tiến trình bên trong kiểu đối tượng. Ví dụ xác thực dữ liệu trước khi điền loại đối tượng. Chúng được khai báo trong phần kiểu đối tượng và được định nghĩa trong phần thân kiểu đối tượng của kiểu đối tượng. Phần thân trong kiểu đối tượng là một phần không bắt buộc. Nếu không có thành viên nào thì kiểu đối tượng sẽ không chứa phần thân.
Tạo đối tượng trong Oracle
Một kiểu Đối tượng không thể được tạo ở cấp chương trình con, Chúng chỉ có thể được tạo ở cấp lược đồ. Khi kiểu đối tượng được xác định trong lược đồ, thì kiểu đối tượng tương tự có thể được sử dụng trong các chương trình con. Loại đối tượng có thể được tạo bằng cách sử dụng 'CREATE TYPE'. Phần thân kiểu chỉ có thể được tạo sau khi tạo kiểu đối tượng của nó.
CREATE TYPEAS OBJECT( ,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION] IS BEGIN END;… );/
Giải thích cú pháp:
- Cú pháp trên cho thấy việc tạo "OBJECT" với các thuộc tính và "OBJECT-BODY" với các phương thức.
- Các phương thức cũng có thể được nạp chồng trong thân đối tượng.
Khai báo Khởi tạo Loại Đối tượng
Giống như các thành phần khác trong PL / SQL, các kiểu đối tượng cũng cần được khai báo trước khi sử dụng chúng trong chương trình.
Khi kiểu đối tượng được tạo, nó có thể được sử dụng trong phần khai báo chương trình con để khai báo một biến của kiểu đối tượng đó.
Bất cứ khi nào bất kỳ biến nào được khai báo trong chương trình con là kiểu đối tượng, tại thời điểm chạy, một thể hiện mới của kiểu đối tượng sẽ được tạo và thể hiện mới được tạo này có thể được gọi là tên biến. Bằng cách này, một loại đối tượng duy nhất có thể lưu trữ nhiều giá trị trong các trường hợp khác nhau.
DECLARE;BEGIN… END;/
Giải thích cú pháp:
- Cú pháp trên cho thấy phần khai báo một biến là một kiểu đối tượng trong phần khai báo.
Một khi biến được khai báo là một kiểu đối tượng trong chương trình con, về mặt nguyên tử, nó sẽ là null tức là toàn bộ đối tượng là null. Nó cần được khởi tạo với các giá trị để sử dụng chúng trong chương trình. Chúng có thể được khởi tạo bằng cách sử dụng các hàm tạo.
Constructors là phương thức ngầm định của một đối tượng có thể được gọi cùng tên với tên của kiểu đối tượng. Cú pháp dưới đây cho thấy việc khởi tạo kiểu đối tượng.
DECLARE;BEGIN := ();END;/
Giải thích cú pháp:
- Cú pháp trên cho thấy việc khởi tạo thể hiện kiểu đối tượng với giá trị null.
- Bây giờ bản thân đối tượng không phải là null như nó đã được khởi tạo, nhưng các thuộc tính bên trong đối tượng sẽ là null vì chúng ta chưa gán bất kỳ giá trị nào cho các thuộc tính này.
Người xây dựng
Constructors là phương thức ngầm định của một đối tượng có thể được gọi cùng tên với tên của kiểu đối tượng. Bất cứ khi nào đối tượng được tham chiếu lần đầu tiên, hàm tạo này sẽ được gọi ngầm định.
Chúng ta cũng có thể khởi tạo các đối tượng bằng cách sử dụng các hàm tạo này. Hàm tạo có thể được định nghĩa rõ ràng bằng cách định nghĩa thành viên trong phần thân kiểu đối tượng có cùng tên của kiểu đối tượng.
Ví dụ 1 : Trong ví dụ sau, chúng ta sẽ sử dụng thành viên kiểu đối tượng để chèn bản ghi vào bảng emp với các giá trị ('RRR', 1005, 20000, 1000) và ('PPP', 1006, 20000, 1001). Khi dữ liệu được chèn vào, chúng tôi sẽ hiển thị cùng một thành viên kiểu đối tượng. Chúng tôi cũng sẽ sử dụng hàm tạo rõ ràng để điền id người quản lý theo mặc định với giá trị 1001 cho bản ghi thứ hai.
Chúng tôi sẽ thực hiện nó trong các bước dưới đây.
- Bước 1:
- Tạo loại đối tượng
- Đối tượng loại nội dung
- Bước 2: Tạo một khối ẩn danh để gọi kiểu đối tượng đã tạo thông qua phương thức khởi tạo ngầm định cho emp_no 1005.
- Bước 3: Tạo một khối ẩn danh để gọi kiểu đối tượng đã tạo thông qua phương thức khởi tạo rõ ràng cho emp_no 1006.
Bước 1) Tạo loại đối tượng và nội dung loại đối tượng
CREATE TYPE emp_object AS OBJECT(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager NUMBER,CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2,p_salary NUMBER) RETURN SELF AS RESULT),MEMBER PROCEDURE insert_records,MEMBER PROCEDURE display_records);/
CREATE OR REPLACE TYPE BODY emp_object ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_output.put_line(’Constructor fired… ');SELF.emp_no:=p_emp_no;|SELF.emp_name:=p_emp_name;SELF.salary:=p_salary;SELF.managerial:=1001;RETURN;END:MEMBER PROCEDURE insert_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_output.put_line('Employee Name:'||emp_name);Dbms_output.put_line('Employee Number:'||emp_no);Dbms_output.put_line('Salary':'||salary);Dbms_output.put_line('Manager:'||manager);END:END:/
Giải thích mã
- Dòng mã 1-9 : Tạo loại đối tượng 'emp_object' với 4 thuộc tính và 3 thành viên. Nó chứa định nghĩa của các hàm tạo chỉ có 3 tham số. (Hàm tạo ngầm định thực tế sẽ chứa số lượng tham số bằng số thuộc tính có trong kiểu đối tượng)
- Dòng mã 10 : Tạo phần thân kiểu.
- Dòng mã 11-21 : Định nghĩa hàm tạo rõ ràng. Gán giá trị tham số cho các thuộc tính và gán giá trị cho thuộc tính "manager" với giá trị mặc định là "1001".
- Dòng mã 22-26 : Xác định thành viên 'insert_records' trong đó các giá trị thuộc tính được chèn vào bảng 'emp'.
- Dòng mã 27-34 : Xác định thành viên 'display_records' trong đó hiển thị các giá trị của các thuộc tính kiểu đối tượng.
Đầu ra
Loại đã tạo
Nhập nội dung đã tạo
Bước 2) Tạo khối ẩn danh để gọi loại đối tượng đã tạo thông qua phương thức khởi tạo ngầm định cho emp_no 1005
DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1005,’RRR',20000,1000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;
Giải thích mã
- Dòng mã 37-45 : Chèn các bản ghi bằng cách sử dụng hàm tạo ngầm định. Lời gọi đến hàm tạo chứa số lượng giá trị thuộc tính thực tế.
- Dòng mã 38 : Khai báo guru_emp_det là kiểu đối tượng của 'emp_object'.
- Dòng mã 41 : Câu lệnh 'guru_emp_det.display_records' được gọi là hàm thành viên 'diplay_records' và các giá trị thuộc tính được hiển thị
- Dòng mã 42 : Câu lệnh 'guru_emp_det.insert_records' được gọi là hàm thành viên 'insert_records' và các giá trị thuộc tính được chèn vào bảng.
Đầu ra
Tên nhân viên: RRR
Số nhân viên: 1005
Lương: 20000
Người quản lý: 1000
Bước 3) Tạo khối ẩn danh để gọi loại đối tượng đã tạo thông qua phương thức khởi tạo rõ ràng cho emp_no 1006
DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1006,'PPP',20000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;/
Đầu ra
Employee Name:PPPEmployee Number:1006Salary:20000Manager:1001
Giải thích mã:
- Dòng mã 46-53 : Chèn các bản ghi bằng cách sử dụng hàm tạo rõ ràng.
- Dòng mã 46 : Khai báo guru_emp_det là kiểu đối tượng của 'emp_object'.
- Dòng mã 50 : Câu lệnh 'guru_emp_det.display_records' được gọi là hàm thành viên 'display_records' và các giá trị thuộc tính được hiển thị
- Dòng mã 51 : Câu lệnh 'guru_emp_det.insert_records' được gọi là hàm thành viên 'insert_records' và các giá trị thuộc tính được chèn vào bảng.
Kế thừa trong loại đối tượng
Thuộc tính kế thừa cho phép kiểu đối tượng con truy cập vào tất cả các thuộc tính và thành viên của kiểu siêu đối tượng hoặc kiểu đối tượng mẹ.
Kiểu đối tượng con được gọi là kiểu đối tượng kế thừa, và kiểu siêu đối tượng được gọi là kiểu đối tượng mẹ. Cú pháp dưới đây cho thấy cách tạo kiểu đối tượng cha và đối tượng kế thừa.
CREATE TYPEAS OBJECT( ,… )NOT FINAL;/
Giải thích cú pháp:
- Cú pháp trên cho thấy việc tạo kiểu SUPER.
CREATE TYPEUNDER ( ,.);/
Giải thích cú pháp:
- Cú pháp trên cho thấy việc tạo kiểu SUB. Nó chứa tất cả các thành viên và thuộc tính từ kiểu đối tượng mẹ.
Ví dụ1: Trong ví dụ dưới đây, chúng ta sẽ sử dụng thuộc tính kế thừa để chèn bản ghi có id người quản lý là '1002' cho bản ghi sau ('RRR', 1007, 20000).
Chúng ta sẽ thực hiện chương trình trên theo các bước sau
- Bước 1: Tạo kiểu SUPER.
- Bước 2: Tạo loại và nội dung SUB.
- Bước 3: Tạo một khối ẩn danh để gọi loại SUB.
Bước 1) Tạo kiểu SUPER hoặc kiểu mẹ.
CREATE TYPE emp_object AS OBJECT(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager NUMBER,CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50),p_salary NUMBER)RETURN SELF AS RESULT),MEMBER PROCEDURE insert_records,MEMBER PROCEDURE display_records)NOT FINAL;/
Giải thích mã:
- Dòng mã 1-9 : Tạo loại đối tượng 'emp_object' với 4 thuộc tính và 3 thành viên. Nó chứa định nghĩa của các hàm tạo chỉ có 3 tham số. Nó đã được khai báo là 'NOT FINAL' vì vậy nó là kiểu cha.
Bước 2) Tạo loại SUB dưới loại SUPER.
CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(emp_no,emp_name:salary,manager):END;END;/
Giải thích mã:
- Dòng mã 10-13 : Tạo sub_emp_object làm kiểu kế thừa với bổ sung một thuộc tính 'default_manager' và khai báo thủ tục thành viên.
- Dòng mã 14 : Tạo phần thân cho kiểu đối tượng kế thừa.
- Dòng mã 1 6 -21 : Xác định thủ tục thành viên đang chèn các bản ghi vào bảng "emp" với các giá trị từ loại đối tượng 'SUPER', ngoại trừ giá trị của người quản lý. Đối với giá trị người quản lý, nó đang sử dụng 'default_manager' từ loại 'SUB'.
Bước 3) Tạo khối ẩn danh để gọi loại SUB
DECLAREguru_emp_det sub_emp_object;BEGINguru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);guru_emp_det.insert_default_mgr;COMMIT;END;/
Giải thích mã:
- Dòng mã 25 : Khai báo 'guru_emp_det' là loại 'sub_emp_object'.
- Dòng mã 27 : Khởi tạo đối tượng với hàm tạo ngầm định. Hàm tạo có 5 tham số (4 thuộc tính từ kiểu PARENT và 2 thuộc tính từ kiểu SUB). Tham số cuối cùng (1002) xác định giá trị cho thuộc tính default_manager
- Dòng mã 28 : Gọi thành viên 'insert_default_mgr' để chèn các bản ghi với id người quản lý mặc định được truyền vào hàm tạo.
Bình đẳng của các đối tượng PL / SQL
Cá thể đối tượng thuộc cùng các đối tượng có thể được so sánh cho bằng nhau. Đối với điều này, chúng ta cần có phương thức đặc biệt trong kiểu đối tượng được gọi là phương thức 'ORDER'.
Phương thức 'ORDER' này phải là hàm trả về kiểu số. Nó nhận hai tham số làm đầu vào, (tham số đầu tiên: id của cá thể đối tượng tự, tham số thứ hai: id của cá thể đối tượng khác).
Id của hai cá thể đối tượng được so sánh và kết quả được trả về dưới dạng số.
- Giá trị dương thể hiện rằng cá thể đối tượng SELF lớn hơn một cá thể khác.
- Giá trị âm thể hiện rằng cá thể đối tượng SELF nhỏ hơn một cá thể khác.
- Số không thể hiện rằng thể hiện đối tượng SELF bằng với một thể hiện khác.
- Nếu bất kỳ trường hợp nào là null, thì hàm này sẽ trả về null.
CREATE TYPE BODYAS OBJECT(ORDER MEMBER FUNCTION match( object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 0;END IF;END;… );/
Giải thích cú pháp:
- Cú pháp trên cho thấy hàm ORDER cần được đưa vào phần thân kiểu để kiểm tra tính bình đẳng.
- Tham số cho hàm này phải là một thể hiện của cùng một loại đối tượng.
- Hàm trên có thể được gọi là "obj_instance_1.match (obj_instance_2)" và biểu thức này sẽ trả về giá trị số như được hiển thị, trong đó obj_instance_1 và obj_instance_2 là phiên bản của object_type_name.
Ví dụ1 : Trong ví dụ sau, chúng ta sẽ xem cách so sánh hai đối tượng. Chúng tôi sẽ tạo hai phiên bản và chúng tôi sẽ so sánh thuộc tính 'tiền lương' giữa chúng. Chúng tôi sẽ thực hiện trong hai bước.
- Bước 1: Tạo kiểu đối tượng và nội dung.
- Bước 2: Tạo khối ẩn danh để gọi so sánh cá thể đối tượng.
Bước 1) Tạo kiểu đối tượng và nội dung.
CREATE TYPE emp_object_equality AS OBJECT(salary NUMBER,ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER);/
CREATE TYPE BODY emp_object_equality ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF: END;END;/
Giải thích mã:
- Dòng mã 1-4: Tạo kiểu đối tượng 'emp_object_equality' với 1 thuộc tính và 1 thành viên.
- Dòng mã 6-16 : Định nghĩa hàm ORDER so sánh thuộc tính 'lương' của cá thể SELF và kiểu cá thể tham số. Nó trả về âm nếu mức lương của SELF nhỏ hơn hoặc dương nếu mức lương của SELF lớn hơn và bằng 0 nếu mức lương bằng nhau.
Đầu ra mã:
Loại đã tạo
Bước 2) Tạo khối ẩn danh để gọi so sánh cá thể đối tượng.
DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/
Đầu ra
Salary of second instance is greater
Giải thích mã:
- Dòng mã 20 : Khai báo l_obj_1 của loại emp_object_equality.
- Dòng mã 21 : Khai báo l_obj_2 của loại emp_object_equality.
- Dòng mã 23 : Đang khởi tạo l_obj_1 với giá trị tiền lương là '15000'
- Dòng mã 24 : Khởi tạo l_obj_1 với giá trị tiền lương là '17000'
- Dòng mã 25-33 : In tin nhắn dựa trên số trả về từ chức năng ĐẶT HÀNG.
Tóm lược
Trong chương này, chúng ta đã thấy kiểu đối tượng và các thuộc tính của chúng. Chúng ta cũng đã thảo luận về Cấu trúc, Thành viên, Thuộc tính, Kế thừa và Bình đẳng trong các đối tượng PL / SQL.