Oracle Hướng dẫn về các loại đối tượng PL/SQL với VÍ DỤ

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. Chúng được tổ chức xung quanh "đối tượng" thay vì "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 thay vì hành động đơn lẻ. Khái niệm này cho phép lập trình viên điền và thao tác các chi tiết ở cấp độ thực thể đối tượng.

Hình ảnh bên dưới 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 chứa một số giá trị thuộc tính, ví dụ như trong 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 đối tượng mô tả những thứ như tính lãi suất, tạo 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.

Các loại đối tượng trong PL/SQL

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 loại đố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 về nhiều loại đối tượng hơn trong chương này.

Thành phần của các loại đối tượng

PL / SQL loại đối tượng chứa chủ yếu hai thành phần.

  1. Thuộc tính
  2. Thành viên/Phương pháp

Thuộc tính

Thuộc tính là cột hoặc trường trong đó 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ể có giá trị bất kỳ 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

Thành viên hoặc Phương thức là các chương trình con được xác định trong loại đố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 quy trình bên trong loại đố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 xác định trong phần thân kiểu đối tượng của kiểu đối tượng. Phần thân trong loại đối tượng là phần tùy chọn. Nếu không có thành viên nào thì loại đối tượng sẽ không chứa phần cơ thể.

Tạo đối tượng trong Oracle

Không thể tạo loại Đối tượng ở cấp chương trình con. Chúng chỉ có thể được tạo ở cấp lược đồ. Khi loại đối tượng được xác định trong lược đồ, thì loại đố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 'TẠO LOẠI'. Phần thân kiểu chỉ có thể được tạo sau khi tạo kiểu đối tượng của nó.

Tạo đối tượng trong OracleTạo đối tượng trong Oracle

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 cho thấy việc tạo 'ĐỐI TƯỢNG' với các thuộc tính và 'ĐỐI TƯỢNG-THÂN' bằng 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, 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 dưới dạng kiểu đối tượng, tại thời gian 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 bằng tên biến. Bằng cách này, một loại đối tượng có thể lưu trữ nhiều giá trị trong các trường hợp khác nhau.

Khai báo khởi tạo loại đối tượng

DECLARE
<variable_name> <object_type_name>;
BEGIN
.
.
END;
/

Giải thích cú pháp:

  • Cú pháp trên thể hiện việc khai báo một biến dưới dạng một kiểu đối tượng trong phần khai báo.

Khi biến được khai báo là một kiểu đối tượng trong một chương trình con, nó sẽ là null nguyên tử tức là toàn bộ đối tượng là null. Nó cần được khởi tạo bằng 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ác hàm tạo.

Hàm tạo là phương thức tiềm ẩn 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 loại đối tượng.

Khai báo khởi tạo loại đố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 cho thấy việc khởi tạo thể hiện loại đối tượng với giá trị null.
  • Bây giờ bản thân đối tượng không phải là null vì 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

Hàm tạo là phương thức tiềm ẩn 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.

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 xác định thành viên trong phần thân 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ẽ 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). Sau khi dữ liệu được chèn, chúng ta sẽ hiển thị dữ liệu tương tự bằng thành viên kiểu đối tượng. Chúng ta cũng sẽ sử dụng hàm tạo rõ ràng để điền giá trị 1001 cho bản ghi thứ hai vào id quản lý theo mặc định.

Chúng tôi sẽ thực hiện nó trong các bước dưới đây.

  • Step1:
  • Tạo loại đối tượng
  • Thân loại đối tượng
  • Bước 2: Tạo một khối ẩn danh để gọi loại đối tượng đã tạo thông qua hàm tạo ngầm cho emp_no 1005.
  • Bước 3: Tạo một khối ẩn danh để gọi loại đối tượng đã tạo thông qua hàm 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

Người xây dự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);
/

Người xây dựng

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.managerial:=1001;
RETURN;
END:
MEMBER PROCEDURE insert_records
IS
BEGIN
INSERT INTO emp VALUES(emp_noemp_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:
/

Giải thích mã

  • Dòng mã 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 các hàm tạo chỉ với 3 tham số. (Hàm tạo ngầm thực tế sẽ chứa số lượng tham số bằng số lượng 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: Xác định 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 'trình quản lý' với giá trị mặc định '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 thuộc tính loại đối tượng.

Đầu ra

Đã tạo loại

Đã tạo nội dung kiểu

Bước 2) Tạo khối ẩn danh để gọi loại đối tượng đã tạo thông qua hàm tạo ngầm cho emp_no 1005

Người xây dựng

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;

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ệnh gọi tới 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à loại đối tượng '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ố lượng 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 hàm tạo rõ ràng cho emp_no 1006

Người xây dựng

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

Giải thích mã:

  • Dòng mã 46-53: Chèn 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à loại đối tượng '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 loại đối tượng phụ truy cập tất cả thuộc tính và thành viên của loại siêu đối tượng hoặc loại đố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 siêu đối tượng được gọi là kiểu đối tượng cha. Cú pháp dưới đây cho thấy cách tạo kiểu đối tượng cha và kiểu đối tượng kế thừa.

Kế thừa trong loại đối tượng

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 cho thấy việc tạo loại SUPER.

Kế thừa trong loại đối tượng

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 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 cha.

Example1: Trong ví dụ bên dưới, chúng ta sẽ sử dụng thuộc tính thừa kế để 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 loại 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 loại SUPER hoặc loại Parent.

Kế thừa trong 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(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 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 các hàm tạo chỉ với 3 tham số. Nó đã được khai báo là 'KHÔNG PHẢI CUỐI CÙNG' nên nó là loại gốc.

Bước 2) Tạo loại SUB dưới loại SUPER.

Kế thừa trong loại đối tượng

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

Giải thích mã:

  • Dòng mã 10-13: Tạo sub_emp_object dưới dạng kiểu kế thừa với một thuộc tính bổ sung '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 được kế thừa.
  • Dòng mã 16-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ị người quản lý. Đối với giá trị người quản lý, nó đang sử dụng loại 'default_manager' từ loại 'SUB'.

Bước 3) Tạo khối ẩn danh để gọi loại SUB

Kế thừa trong loại đối tượng

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

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 bằng hàm tạo ngầm định. Hàm tạo có 5 tham số (4 thuộc tính từ loại PARENT và 2 thuộc tính từ loại 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 có id người quản lý mặc định được truyền trong hàm tạo.

Sự bình đẳng của các đối tượng PL/SQL

Thể hiện đối tượng thuộc cùng một đối tượng có thể được so sánh về sự bằng nhau. Để làm được điều này, chúng ta cần có phương thức đặc biệt trong loại đố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ó lấy hai tham số làm đầu vào, (tham số đầu tiên: id của thể hiện đối tượng tự, tham số thứ hai: id của thể hiện đối tượng khác).

Id của hai thể hiện đối tượng được so sánh và kết quả được trả về dưới dạng số.

  • Giá trị dương biểu thị rằng phiên bản đối tượng SELF lớn hơn phiên bản khác.
  • Giá trị âm biểu thị rằng phiên bản đối tượng SELF nhỏ hơn phiên bản khác.
  • Số 0 thể hiện rằng thể hiện của đố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.

Sự bình đẳng của các đối tượng PL/SQL

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 hiển thị 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 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 ta sẽ tạo hai thể hiện và so sánh thuộc tính 'salary' giữa chúng. Chúng ta sẽ thực hiện int hai bước.

  • Bước 1: Tạo kiểu và nội dung đối tượng.
  • Bước 2: Tạo khối ẩn danh để gọi so sánh đối tượng.

Bước 1) Tạo loại đối tượng và nội dung.

Sự bình đẳng của các đối tượng PL/SQL

Sự bình đẳng của các đối tượng PL/SQL

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

Giải thích mã:

  • Dòng mã 1-4: Tạo loại đố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 'salary' của thể hiện SELF và loại thể hiện tham số. Nó trả về giá trị âm nếu lương SELF nhỏ hơn hoặc giá trị dương nếu lương SELF lớn hơn và 0 nếu lương bằng nhau.

Đầu ra mã:

Đã tạo loại

Bước 2) Tạo khối ẩn danh để gọi so sánh phiên bản đối tượng.

Sự bình đẳng của các đối tượng PL/SQL

DECLARE
l_obj_l emp_object_equality;
l_obj_2 emp_object_equality;
BEGIN
l_obj_l:=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_l.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

Giải thích mã:

  • Dòng mã 20: Khai báo l_obj_1 của kiểu emp_object_equality.
  • Dòng mã 21: Khai báo l_obj_2 của kiểu emp_object_equality.
  • Dòng mã 23: Đang khởi tạo l_obj_1 với giá trị lương là '15000'
  • Dòng mã 24: Đang khởi tạo l_obj_1 với giá trị lương là '17000'
  • Dòng mã 25-33: In tin nhắn dựa trên số trả về từ hàm ORDER.

Tổng kết

Trong chương này, chúng ta đã thấy loại đối tượng và các thuộc tính của chúng. Chúng ta cũng đã thảo luận về Hàm tạo, Thành viên, Thuộc tính, Kế thừa và Bình đẳng trong các đối tượng PL/SQL.