Oracle Các kiểu đối tượng PL/SQL: Lệnh CREATE TYPE kèm ví dụ.
⚡ Tóm tắt thông minh
Các kiểu đối tượng trong PL/SQL mang lại lập trình hướng đối tượng cho... OracleCho phép bạn mô hình hóa các thực thể trong thế giới thực với các thuộc tính và phương thức. Chúng hỗ trợ các hàm tạo, kế thừa và so sánh bằng nhau, do đó một kiểu dữ liệu cấp lược đồ duy nhất có thể lưu trữ và xử lý dữ liệu có cấu trúc.

Loại đối tượng trong PL/SQL là gì?
Lập trình hướng đối tượng đặc biệt phù 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. Các chương trình được tổ chức xung quanh "đối tượng" thay vì "hành động"; nghĩa là, chúng được thiết kế để làm việc và tương tác với toàn bộ đối tượng chứ không phải một hành động đơn lẻ. Cách tiếp cận này cho phép lập trình viên điền thông tin và thao tác các chi tiết ở cấp độ thực thể đối tượng.
Hình ảnh bên dưới minh họa một ví dụ về kiểu đố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 của đối tượng chứa các giá trị — đối với tài khoản ngân hàng, đó là số tài khoản, số dư ngân hàng, v.v. — trong khi các phương thức của đối tượng mô tả các hành động như tính lãi suất hoặc tạo sao kê ngân hàng, mỗi hành động đều yêu cầu một quy trình để hoàn thành.
In PL / SQLLậ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. Các phần bên dưới sẽ khám phá các kiểu đối tượng, các thành phần của chúng, cũng như cách tạo và sử dụng chúng.
Thành phần của các loại đối tượng
Một kiểu đối tượng PL/SQL chủ yếu bao gồm 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ác cột hoặc trường lưu trữ dữ liệu. Mỗi thuộc tính đượ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 đó. Một thuộc tính có thể thuộc bất kỳ kiểu dữ liệu hợp lệ nào. Kiểu dữ liệu PL/SQLhoặc nó có thể thuộc loại đối tượng khác.
Thành viên/Phương pháp
Các thành viên, hay phương thức, là chương trình con Các thành viên này được định nghĩa bên trong kiểu đối tượng. Chúng không được sử dụng để lưu trữ dữ liệu; thay vào đó, chúng định nghĩa quá trình xử lý được thực hiện bên trong kiểu đối tượng — ví dụ: xác thực dữ liệu trước khi điền vào đối tượng. Chúng được khai báo trong đặc tả kiểu đối tượng và được định nghĩa trong phần thân của kiểu đối tượng. Phần thân là tùy chọn: nếu không có thành viên nào, kiểu đối tượng sẽ không có phần thân.
Tạo đối tượng trong Oracle
Kiểu đối tượng không thể được tạo ở cấp độ chương trình con; nó chỉ có thể được tạo ở cấp độ lược đồ. Sau khi kiểu đối tượng được định nghĩa trong lược đồ, nó có thể được sử dụng trong các chương trình con. Kiểu đối tượng được tạo bằng câu lệnh “CREATE TYPE”, và phần thân của kiểu chỉ có thể được tạo sau khi kiểu đối tượng đó tồn tại.
Các ảnh chụp màn hình bên dưới hiển thị cú pháp CREATE TYPE để khai báo đối tượng và cú pháp CREATE TYPE BODY để định nghĩa các phương thức của đối tượng đó.
CREATE TYPE<object_type_name> AS OBJECT ( <attribute_l><datatype>, . . ); / CREATE TYPE BODY<object_type_name> AS OBJECT ( MEMBER[PROCEDURE|FUNCTION]<member_name> IS <declarative section> BEGIN <execution part> END; . . ); /
Giải thích cú pháp:
- Cú pháp trên thể hiện việc tạo ra một OBJECT với các thuộc tính và một OBJECT BODY với các phương thức.
- Các phương thức cũng có thể bị quá tải trong phần 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, kiểu đối tượng phải được khai báo trước khi được sử dụng trong chương trình. Sau khi kiểu đối tượng được tạo, nó có thể được sử dụng trong phần khai báo của chương trình con để khai báo một biến thuộc kiểu đối tượng đó.
Mỗi khi một biến được khai báo là kiểu đối tượng, tại thời điểm chạy chương trình, một thể hiện mới của kiểu đối tượng đó sẽ được tạo ra, và thể hiện mới này được tham chiếu bằng tên biến. Bằng cách này, một kiểu đối tượng duy nhất có thể lưu trữ nhiều giá trị dưới các thể hiện khác nhau.
Ảnh chụp màn hình bên dưới cho thấy một biến được khai báo là kiểu đối tượng bên trong một Khối PL/SQL.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Giải thích cú pháp:
- Cú pháp trên thể hiện cách khai báo một đối tượng. biến như một kiểu đối tượng trong phần khai báo.
Một khi biến được khai báo là kiểu đối tượng trong chương trình con, nó sẽ có giá trị null về mặt nguyên tử — toàn bộ đối tượng đó đều là null. Nó phải được khởi tạo với các giá trị trước khi có thể được sử dụng trong chương trình. Các đối tượng được khởi tạo bằng cách sử dụng hàm tạo.
Hàm tạo là phương thức ngầm định của một đối tượng có thể được tham chiếu bằng cùng tên với kiểu đối tượng. Ảnh chụp màn hình bên dưới hiển thị quá trình khởi tạo một thể hiện của kiểu đối tượng.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Giải thích cú pháp:
- Cú pháp trên thể hiện việc khởi tạo thể hiện của kiểu đối tượng với giá trị null.
- Bản thân đối tượng không còn là null nữa sau khi được khởi tạo, nhưng các thuộc tính bên trong đối tượng vẫn là null cho đến khi được gán giá trị.
Người xây dựng
Hàm tạo là phương thức ngầm định của một đối tượng, có thể được tham chiếu bằng cùng tên với 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 một cách ngầm định.
Bạn 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. Một hàm tạo có thể được định nghĩa rõ ràng bằng cách định nghĩa một thành viên trong phần thân của kiểu đối tượng có cùng tên với kiểu đối tượng đó.
Ví dụ 1: Trong ví dụ sau, chúng ta sử dụng thành viên kiểu đối tượng để chèn các bản ghi vào bảng emp với các giá trị ('RRR', 1005, 20000, 1000) và ('PPP', 1006, 20000, 1001). Sau khi dữ liệu được chèn, chúng ta hiển thị nó bằng cách sử dụng thành viên kiểu đối tượng. Chúng ta cũng sử dụng một hàm tạo tường minh để điền ID người quản lý với giá trị mặc định là 1001 cho bản ghi thứ hai.
Chúng tôi thực hiện theo các bước sau.
- Bước 1: Tạo kiểu đối tượng và phần thân của kiểu đối tượng.
- Bước 2: Tạo một khối ẩn danh để gọi kiểu đối tượng thông qua hàm 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 thông qua hàm tạo tường minh cho emp_no 1006.
Bước 1) Tạo kiểu đối tượng và phần thân của kiểu đối tượng.
Ảnh chụp màn hình bên dưới hiển thị đặc tả kiểu đối tượng emp_object đang được tạo cùng với các thuộc tính và thành viên của nó.
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); /
Ảnh chụp màn hình bên dưới cho thấy phần thân của kiểu emp_object được tạo ra bằng hàm tạo tường minh và các thủ tục thành viên.
CREATE OR REPLACE TYPE BODY emp_object AS CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT IS BEGIN Dbms_output.put_line('Constructor fired..'); SELF.emp_no:=p_emp_no; SELF.emp_name:=p_emp_name; SELF.salary:=p_salary; SELF.manager:=1001; RETURN; END; MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name,salary,manager); END; MEMBER PROCEDURE display_records IS BEGIN Dbms_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; /
Code Giải thích
- Code dòng 1-9: Tạo kiểu đố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 một hàm tạo chỉ có 3 tham số. (Hàm tạo ngầm định thực tế chứa số lượng tham số bằng với số lượng thuộc tính có trong kiểu đối tượng.)
- Code dòng 10: Tạo phần thân kiểu dữ liệu.
- Code dòng 11-21: Định nghĩa hàm tạo tường minh. Gán giá trị tham số cho các thuộc tính và gán giá trị mặc định '1001' cho thuộc tính 'manager'.
- Code dòng 22-26: Định nghĩa thành viên 'insert_records', nơi các giá trị thuộc tính được chèn vào bảng 'emp'.
- Code dòng 27-34: Định nghĩa thành viên 'display_records', dùng để hiển thị giá trị của các thuộc tính kiểu đối tượng.
Đầu ra:
Đã tạo loại
Đã tạo nội dung kiểu
Bước 2) Tạo một khối ẩn danh để gọi kiểu đối tượng đã tạo thông qua hàm tạo ngầm định cho emp_no 1005.
Ảnh chụp màn hình bên dưới hiển thị khối lệnh ẩn danh gọi emp_object thông qua hàm tạo ngầm định.
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,'RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END;
Code Giải thích
- Code dòng 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ế.
- Code dòng 38: Khai báo 'guru_emp_det' là kiểu đối tượng 'emp_object'.
- Code dòng 41: Câu lệnh 'guru_emp_det.display_records' gọi thành viên 'display_records' và các giá trị thuộc tính được hiển thị.
- Code dòng 42: Câu lệnh 'guru_emp_det.insert_records' gọi thành viên 'insert_records' và các giá trị thuộc tính được chèn vào bảng. Sau đó, khối lệnh sẽ thực hiện việc cam kết. giao dịch.
Đầu ra:
Tên nhân viên: RRR
Số lượng nhân viên: 1005
Lương: 20000
Người quản lý: 1000
Bước 3) Tạo một khối ẩn danh để gọi kiểu đối tượng đã tạo thông qua hàm tạo tường minh cho emp_no 1006.
Ảnh chụp màn hình bên dưới hiển thị khối mã ẩn danh gọi emp_object thông qua hàm tạo tường minh với ba tham số.
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1006,'PPP',20000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
Đầu ra
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code Giải thích:
- Code dòng 46-53: Chèn bản ghi bằng cách sử dụng hàm tạo tường minh.
- Code dòng 46: Khai báo 'guru_emp_det' là kiểu đối tượng 'emp_object'.
- Code dòng 50: Câu lệnh 'guru_emp_det.display_records' gọi thành viên 'display_records' và các giá trị thuộc tính được hiển thị.
- Code dòng 51: Câu lệnh 'guru_emp_det.insert_records' gọi thành viên 'insert_records' và các giá trị thuộc tính được chèn vào bảng. Vì chỉ có ba đối số được truyền vào, hàm tạo tường minh sẽ đặt ID người quản lý về giá trị mặc định là 1001.
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 tất cả các thuộc tính và thành viên của kiểu đối tượng cha.
Kiểu đối tượng con được gọi là kiểu đối tượng kế thừa, và kiểu đối tượng cha được gọi là kiểu đối tượng cha mẹ. Cú pháp dưới đây cho thấy cách tạo kiểu đối tượng cha mẹ và kiểu đối tượng kế thừa. Ảnh chụp màn hình bên dưới hiển thị cú pháp kiểu cha mẹ (SUPER) được đánh dấu là NOT FINAL.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Giải thích cú pháp:
- Cú pháp trên thể hiện việc tạo ra kiểu SUPER. Mệnh đề NOT FINAL cho phép kiểu này được kế thừa.
Ảnh chụp màn hình bên dưới hiển thị cú pháp kiểu kế thừa (SUB) được tạo bằng từ khóa UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Giải thích cú pháp:
- Cú pháp trên thể hiện việc tạo kiểu SUB. Kiểu này chứa tất cả các thành viên và thuộc tính từ kiểu đối tượng cha.
Ví dụ 1: Trong ví dụ bên dưới, chúng ta sử dụng thuộc tính kế thừa để chèn một bản ghi với ID người quản lý '1002' cho bản ghi ('RRR', 1007, 20000). Chúng ta thực thi chương trình theo các bước sau.
- Bước 1: Tạo kiểu dữ liệu SUPER.
- Bước 2: Tạo kiểu SUB và nội dung.
- Bước 3: Tạo một khối ẩn danh để gọi kiểu SUB.
Bước 1) Tạo kiểu SUPER hoặc kiểu cha.
Ảnh chụp màn hình bên dưới cho thấy kiểu cha emp_object được tạo với mệnh đề NOT FINAL.
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; /
Code Giải thích:
- Code dòng 1-9: Tạo kiểu đố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 một hàm tạo chỉ có 3 tham số. Nó được khai báo là 'NOT FINAL', do đó nó là một kiểu cha.
Bước 2) Tạo kiểu con (SUB type) thuộc kiểu cha (SUPER type).
Ảnh chụp màn hình bên dưới hiển thị kiểu kế thừa sub_emp_object và phần thân của nó đang được tạo ra.
CREATE OR REPLACE TYPE sub_emp_object UNDER emp_object (default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr); / CREATE OR REPLACE TYPE BODY sub_emp_object AS MEMBER PROCEDURE insert_default_mgr IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name,salary,manager); END; END; /
Code Giải thích:
- Code dòng 10-13: Tạo 'sub_emp_object' làm kiểu kế thừa với một thuộc tính bổ sung là 'default_manager' và một khai báo thủ tục thành viên.
- Code dòng 14: Tạo phần thân cho kiểu đối tượng kế thừa.
- Code dòng 16-21: Định nghĩa thủ tục thành viên chèn các bản ghi vào bảng 'emp' với các giá trị từ kiểu đối tượng SUPER, ngoại trừ giá trị manager. Đối với giá trị manager, nó sử dụng 'default_manager' từ kiểu SUB.
Bước 3) Tạo khối ẩn danh để gọi kiểu SUB.
Ảnh chụp màn hình bên dưới hiển thị khối ẩn danh gọi kiểu SUB và chèn ID người quản lý mặc định.
DECLARE guru_emp_det sub_emp_object; BEGIN guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002); guru_emp_det.insert_default_mgr; COMMIT; END; /
Code Giải thích:
- Code dòng 25: Khai báo 'guru_emp_det' là kiểu 'sub_emp_object'.
- Code dòng 27: Khởi tạo đối tượng bằng 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à 1 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.
- Code dòng 28: Gọi thành viên 'insert_default_mgr' để chèn bản ghi với ID người quản lý mặc định được truyền vào trong hàm tạo.
Sự bình đẳng của các đối tượng PL/SQL
Các thể hiện của đối tượng thuộc cùng một kiểu đối tượng có thể được so sánh về sự bằng nhau. Để làm được điều này, kiểu đối tượng cần một phương thức đặc biệt gọi là phương thức ORDER.
Phương thức ORDER này phải là một hàm trả về kiểu dữ liệu số. Nó nhận hai tham số đầu vào (tham số thứ nhất: ID của thể hiện đối tượng tự thân; tham số thứ hai: ID của thể hiện đối tượng khác).
Mã định danh (ID) của hai đối tượng được so sánh, và kết quả được trả về dưới dạng một con số.
- Giá trị dương cho biết thể hiện của đối tượng SELF lớn hơn thể hiện khác.
- Giá trị âm cho biết thể hiện của đối tượng SELF nhỏ hơn thể hiện kia.
- Số 0 cho biết thể hiện của đối tượng SELF bằng với thể hiện khác.
- Nếu bất kỳ trường hợp nào là null, hàm sẽ trả về null.
Ảnh chụp màn hình bên dưới hiển thị cú pháp hàm thành viên ORDER cần được đưa vào phần thân kiểu để kiểm tra sự bằng nhau.
CREATE TYPE BODY<object_type_name_ 1>AS OBJECT ( ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1) RETURN INTEGER IS BEGIN IF <attribute_name>parameter <attribute_name>THEN RETURN -1; --any negative number will do ELSIF id>c.id THEN RETURN 1; --any positive number will do ELSE RETURN 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 sự bằng nhau.
- Tham số cho hàm này phải là một thể hiện của cùng loại đối tượng.
- Hàm có thể được gọi là “obj_instance_1.match(obj_instance_2)”, và biểu thức này trả về giá trị số được hiển thị, trong đó obj_instance_1 và obj_instance_2 là các thể hiện của kiểu đối tượng.
Ví dụ 1: Trong ví dụ sau, chúng ta so sánh hai đối tượng. Chúng ta tạo hai thể hiện và so sánh thuộc tính 'salary' giữa chúng. Chúng ta thực hiện điều này trong hai bước.
- Bước 1: Tạo kiểu đối tượng và phần thân.
- Bước 2: Tạo khối ẩn danh để so sánh các thể hiện đối tượng.
Bước 1) Tạo kiểu đối tượng và phần thân.
Các ảnh chụp màn hình bên dưới hiển thị đặc tả emp_object_equality và phần thân của nó, trong đó định nghĩa hàm ORDER dùng để so sánh thuộc tính lương.
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 AS ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER IS BEGIN IF salary<c.salary THEN RETURN -1; ELSIF salary>c.salary THEN RETURN 1; ELSE RETURN 0; END IF; END; END; /
Code Giải thích:
- Code dòng 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.
- Code dòng 6-16: Định nghĩa hàm ORDER so sánh thuộc tính 'salary' của thể hiện SELF và thể hiện tham số. Hàm này trả về giá trị âm nếu lương của SELF thấp hơn, giá trị dương nếu lương của SELF cao hơn và 0 nếu lương bằng nhau.
Code Đầu ra:
Đã tạo loại
Bước 2) Tạo khối ẩn danh để so sánh các thể hiện đối tượng.
Ảnh chụp màn hình bên dưới hiển thị khối ẩn danh so sánh hai trường hợp emp_object_equality dựa trên mức lương.
DECLARE l_obj_1 emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_1:=emp_object_equality(15000); l_obj_2:=emp_object_equality(17000); IF l_obj_1.equals(l_obj_2)>0 THEN Dbms_output.put_line('Salary of first instance is greater'); ELSIF l_obj_1.equals(l_obj_2)<0 THEN Dbms_output.put_line('Salary of second instance is greater'); ELSE Dbms_output.put_line('Salaries are equal'); END IF; END; /
Đầu ra
Salary of second instance is greater
Code Giải thích:
- Code dòng 20: Khai báo 'l_obj_1' thuộc kiểu 'emp_object_equality'.
- Code dòng 21: Khai báo 'l_obj_2' thuộc kiểu 'emp_object_equality'.
- Code dòng 23: Khởi tạo 'l_obj_1' với giá trị lương '15000'.
- Code dòng 24: Khởi tạo 'l_obj_2' với giá trị lương '17000'.
- Code dòng 25-33: In thông báo dựa trên số được trả về bởi hàm ORDER.


















