Oracle บทช่วยสอนประเภทวัตถุ PL/SQL พร้อมตัวอย่าง

ประเภทวัตถุใน PL/SQL คืออะไร

การเขียนโปรแกรมเชิงวัตถุเหมาะเป็นพิเศษสำหรับการสร้างส่วนประกอบที่นำมาใช้ซ้ำได้และแอปพลิเคชันที่ซับซ้อน โดยจะจัดระบบตาม "วัตถุ" มากกว่า "การกระทำ" กล่าวคือ โปรแกรมได้รับการออกแบบมาให้ทำงานและโต้ตอบกับวัตถุทั้งหมดแทนที่จะดำเนินการเพียงขั้นตอนเดียว แนวคิดนี้ช่วยให้โปรแกรมเมอร์สามารถเพิ่มและจัดการรายละเอียดในระดับเอนทิตีของวัตถุได้

รูปภาพด้านล่างแสดงตัวอย่างของชนิดออบเจ็กต์ซึ่งบัญชีธนาคารถือเป็นเอนทิตีออบเจ็กต์ คุณลักษณะของวัตถุรวมถึงสิ่งที่มีค่าแอตทริบิวต์บางอย่าง เช่น ในบัญชีธนาคาร เป็นหมายเลขบัญชี ยอดคงเหลือในธนาคาร ฯลฯ ในขณะที่วิธีการแบบอ็อบเจ็กต์จะอธิบายสิ่งต่างๆ เช่น การคำนวณอัตราดอกเบี้ย การสร้างใบแจ้งยอดจากธนาคาร ฯลฯ ซึ่งต้องใช้กระบวนการบางอย่างจึงจะเสร็จสมบูรณ์

ประเภทวัตถุใน PL/SQL

ในการเขียนโปรแกรมเชิงวัตถุ PL/SQL ขึ้นอยู่กับประเภทของวัตถุ

ประเภทออบเจ็กต์สามารถแสดงถึงเอนทิตีในโลกแห่งความเป็นจริงได้ เราจะพูดถึงประเภทวัตถุเพิ่มเติมในบทนี้

ส่วนประกอบของประเภทวัตถุ

PL / SQL ประเภทวัตถุประกอบด้วยสององค์ประกอบหลัก

  1. คุณสมบัติ
  2. สมาชิก/วิธีการ

คุณสมบัติ

คุณลักษณะคือคอลัมน์หรือช่องที่เก็บข้อมูล แต่ละแอตทริบิวต์จะถูกแมปกับประเภทข้อมูลที่กำหนดประเภทการประมวลผลและการจัดเก็บสำหรับแอตทริบิวต์นั้น คุณลักษณะสามารถเป็นค่าใดก็ได้ที่ถูกต้อง ประเภทข้อมูล PL/SQLหรืออาจเป็นวัตถุประเภทอื่นก็ได้

สมาชิก/วิธีการ

Members หรือ Method คือโปรแกรมย่อยที่กำหนดไว้ในประเภทอ็อบเจ็กต์ พวกเขาไม่ได้ใช้เพื่อจัดเก็บข้อมูลใดๆ ส่วนใหญ่จะใช้เพื่อกำหนดกระบวนการภายในประเภทวัตถุ สำหรับตัวอย่างการตรวจสอบข้อมูลก่อนเติมประเภทออบเจ็กต์ มีการประกาศในส่วนประเภทออบเจ็กต์และกำหนดไว้ในส่วนเนื้อหาประเภทออบเจ็กต์ของประเภทออบเจ็กต์ ส่วนเนื้อหาในประเภทวัตถุเป็นส่วนเสริม หากไม่มีสมาชิกอยู่ ประเภทอ็อบเจ็กต์จะไม่มีส่วนของร่างกาย

สร้างวัตถุใน Oracle

ประเภทอ็อบเจ็กต์ไม่สามารถสร้างได้ในระดับโปรแกรมย่อย แต่สามารถสร้างได้ในระดับสคีมาเท่านั้น เมื่อกำหนดประเภทอ็อบเจ็กต์ในสคีมาแล้ว ก็สามารถใช้ประเภทเดียวกันในโปรแกรมย่อยได้ สามารถสร้างประเภทออบเจ็กต์ได้โดยใช้ 'CREATE TYPE' สามารถสร้างเนื้อหาประเภทได้หลังจากสร้างประเภทออบเจ็กต์แล้วเท่านั้น

สร้างวัตถุใน Oracleสร้างวัตถุใน 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;‭
.
.	‬
);
/

คำอธิบายไวยากรณ์:

  • ไวยากรณ์ข้างต้นแสดงการสร้าง 'OBJECT' ด้วยแอตทริบิวต์และ 'OBJECT-BODY' ด้วยวิธีการ
  • วิธีการนี้สามารถโอเวอร์โหลดได้ในตัววัตถุ

การประกาศการเริ่มต้นประเภทวัตถุ

เช่นเดียวกับส่วนประกอบอื่นๆ ใน PL/SQL จำเป็นต้องประกาศประเภทอ็อบเจ็กต์ก่อนที่จะใช้ในโปรแกรม

เมื่อประเภทอ็อบเจ็กต์ถูกสร้างขึ้นแล้ว จะสามารถนำมาใช้ในส่วนการประกาศโปรแกรมย่อยเพื่อประกาศตัวแปรของประเภทอ็อบเจ็กต์นั้น

เมื่อใดก็ตามที่ตัวแปรใดๆ ถูกประกาศในโปรแกรมย่อยเป็นประเภทออบเจ็กต์ ขณะรันไทม์อินสแตนซ์ใหม่ของประเภทออบเจ็กต์จะถูกสร้างขึ้น และอินสแตนซ์ที่สร้างขึ้นใหม่นี้สามารถอ้างอิงถึงชื่อตัวแปรได้ ด้วยวิธีนี้ อ็อบเจ็กต์ประเภทเดียวสามารถเก็บค่าได้หลายค่าภายใต้อินสแตนซ์ที่ต่างกัน

การประกาศการเริ่มต้นประเภทวัตถุ

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

คำอธิบายไวยากรณ์:

  • ไวยากรณ์ข้างต้นแสดงการประกาศตัวแปรเป็นประเภทวัตถุในส่วนการประกาศ

เมื่อตัวแปรถูกประกาศเป็นประเภทอ็อบเจ็กต์ในโปรแกรมย่อยแล้ว ตัวแปรนั้นจะกลายเป็นค่าว่างโดยอัตโนมัติ กล่าวคือ อ็อบเจ็กต์ทั้งหมดจะกลายเป็นค่าว่าง ตัวแปรต้องได้รับการเริ่มต้นด้วยค่าต่างๆ จึงจะใช้ค่าเหล่านี้ในโปรแกรมได้ โดยสามารถเริ่มต้นค่าได้โดยใช้ตัวสร้าง

ตัวสร้างเป็นวิธีการโดยนัยของวัตถุที่สามารถอ้างอิงด้วยชื่อเดียวกันกับประเภทวัตถุ ไวยากรณ์ด้านล่างแสดงการเริ่มต้นของประเภทวัตถุ

การประกาศการเริ่มต้นประเภทวัตถุ

DECLARE
<variable_name> <object_type_name>; 
BEGIN
<variable_name>:=<object_type_name>();
END;
/

คำอธิบายไวยากรณ์:

  • ไวยากรณ์ข้างต้นแสดงการเริ่มต้นของอินสแตนซ์ประเภทวัตถุที่มีค่าว่าง
  • ตอนนี้ออบเจ็กต์เองไม่เป็นโมฆะเนื่องจากได้เริ่มต้นใช้งานแล้ว แต่คุณลักษณะภายในออบเจ็กต์จะเป็นโมฆะเนื่องจากเราไม่ได้กำหนดค่าใด ๆ ให้กับคุณลักษณะเหล่านี้

ตัวสร้าง

ตัวสร้างเป็นวิธีการโดยนัยของวัตถุที่สามารถอ้างอิงด้วยชื่อเดียวกันกับประเภทวัตถุ เมื่อใดก็ตามที่วัตถุถูกอ้างอิงเป็นครั้งแรก Constructor นี้จะถูกเรียกโดยปริยาย

นอกจากนี้เรายังสามารถเริ่มต้นวัตถุโดยใช้ตัวสร้างเหล่านี้ ตัวสร้างสามารถกำหนดได้อย่างชัดเจนโดยการกำหนดสมาชิกในเนื้อหาประเภทวัตถุที่มีชื่อเดียวกันกับประเภทวัตถุ

1 ตัวอย่าง:ในตัวอย่างต่อไปนี้ เราจะใช้เมมเบอร์ประเภทออบเจ็กต์เพื่อแทรกเรกคอร์ดลงในตาราง emp ด้วยค่า ('RRR', 1005, 20000, 1000) และ ('PPP', 1006, 20000, 1001) เมื่อแทรกข้อมูลแล้ว เราจะแสดงข้อมูลเดียวกันโดยใช้เมมเบอร์ประเภทออบเจ็กต์ นอกจากนี้ เรายังจะใช้คอนสตรัคเตอร์ที่ชัดเจนเพื่อเติมค่า 1001 ลงใน ID ผู้จัดการตามค่าเริ่มต้นสำหรับเรกคอร์ดที่สอง

เราจะดำเนินการตามขั้นตอนด้านล่าง

  • Step1:
  • สร้างประเภทวัตถุ
  • เนื้อความประเภทวัตถุ
  • ขั้นตอนที่ 2: การสร้างบล็อกที่ไม่ระบุชื่อเพื่อเรียกประเภทวัตถุที่สร้างขึ้นผ่านตัวสร้างโดยนัยสำหรับ emp_no 1005
  • ขั้นตอนที่ 3: การสร้างบล็อกที่ไม่ระบุชื่อเพื่อเรียกประเภทวัตถุที่สร้างขึ้นผ่านตัวสร้างที่ชัดเจนสำหรับ emp_no 1006

ขั้นตอน 1) สร้างประเภทวัตถุและเนื้อหาประเภทวัตถุ

ตัวสร้าง

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

คำอธิบายรหัส

  • รหัสบรรทัด 1-9: การสร้างประเภทวัตถุ 'emp_object' ด้วย 4 แอตทริบิวต์และ 3 สมาชิก ประกอบด้วยคำจำกัดความของตัวสร้างที่มีพารามิเตอร์เพียง 3 ตัวเท่านั้น (ตัวสร้างโดยนัยจริงจะมีจำนวนพารามิเตอร์เท่ากับจำนวนคุณลักษณะที่มีอยู่ในประเภทวัตถุ)
  • รหัสบรรทัดที่ 10: การสร้างเนื้อหาประเภท
  • รหัสบรรทัด 11-21: การกำหนด Constructor ที่ชัดเจน การกำหนดค่าพารามิเตอร์ให้กับแอตทริบิวต์และการกำหนดค่าสำหรับแอตทริบิวต์ 'ผู้จัดการ' ด้วยค่าเริ่มต้น '1001'
  • รหัสบรรทัด 22-26: การกำหนดสมาชิก 'insert_records' ซึ่งค่าแอตทริบิวต์จะถูกแทรกลงในตาราง 'emp'
  • รหัสบรรทัด 27-34: การกำหนดสมาชิก 'display_records' ซึ่งแสดงค่าของแอตทริบิวต์ประเภทอ็อบเจ็กต์

เอาท์พุต

สร้างประเภทแล้ว

ประเภทเนื้อหาที่สร้างขึ้น

ขั้นตอน 2) การสร้างบล็อกที่ไม่ระบุชื่อเพื่อเรียกประเภทวัตถุที่สร้างขึ้นผ่านตัวสร้างโดยนัยสำหรับ emp_no 1005

ตัวสร้าง

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;

คำอธิบายรหัส

  • รหัสบรรทัด 37-45: การแทรกบันทึกโดยใช้ตัวสร้างโดยนัย การเรียกตัวสร้างมีจำนวนค่าแอตทริบิวต์ตามจริง
  • รหัสบรรทัดที่ 38: ประกาศ guru_emp_det เป็นชนิดอ็อบเจ็กต์ของ 'emp_object'
  • รหัสบรรทัดที่ 41:คำสั่ง 'guru_emp_det.display_records' เรียกฟังก์ชันสมาชิก 'diplay_records' และแสดงค่าแอตทริบิวต์
  • รหัสบรรทัดที่ 42: คำสั่ง 'guru_emp_det.insert_records' ที่เรียกว่าฟังก์ชันสมาชิก 'insert_records' และค่าแอตทริบิวต์จะถูกแทรกลงในตาราง

เอาท์พุต

ชื่อพนักงาน: RRR

หมายเลขพนักงาน: 1005

เงินเดือน: 20000

ผู้จัดการ : 1000

ขั้นตอน 3) การสร้างบล็อกที่ไม่ระบุชื่อเพื่อเรียกประเภทวัตถุที่สร้างขึ้นผ่านตัวสร้างที่ชัดเจนสำหรับ emp_no 1006

ตัวสร้าง

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

เอาท์พุต

Employee Name:PPP 
Employee Number:1006 
Salary:20000 
Manager:1001

คำอธิบายรหัส:

  • รหัสบรรทัด 46-53: การแทรกบันทึกโดยใช้ตัวสร้างที่ชัดเจน
  • รหัสบรรทัดที่ 46: ประกาศ guru_emp_det เป็นชนิดอ็อบเจ็กต์ของ 'emp_object'
  • รหัสบรรทัดที่ 50:คำสั่ง 'guru_emp_det.display_records' เรียกใช้ฟังก์ชันสมาชิก 'display_records' และแสดงค่าแอตทริบิวต์
  • รหัสบรรทัดที่ 51: คำสั่ง 'guru_emp_det.insert_records' ที่เรียกว่าฟังก์ชันสมาชิก 'insert_records' และค่าแอตทริบิวต์จะถูกแทรกลงในตาราง

การสืบทอดในประเภทวัตถุ

คุณสมบัติการสืบทอดช่วยให้ประเภทวัตถุย่อยสามารถเข้าถึงแอตทริบิวต์และสมาชิกของประเภทวัตถุซุปเปอร์หรือประเภทวัตถุแม่ทั้งหมด

ประเภทวัตถุย่อยเรียกว่าประเภทวัตถุที่สืบทอด และประเภทวัตถุซุปเปอร์เรียกว่าประเภทวัตถุหลัก ไวยากรณ์ด้านล่างแสดงวิธีการสร้างพาเรนต์และประเภทอ็อบเจ็กต์ที่สืบทอด

การสืบทอดในประเภทวัตถุ

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

คำอธิบายไวยากรณ์:

  • ไวยากรณ์ข้างต้นแสดงการสร้างประเภท SUPER

การสืบทอดในประเภทวัตถุ

CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent>
(
<attribute_l><datatype>,
.
);
/

คำอธิบายไวยากรณ์:

  • ไวยากรณ์ด้านบนแสดงการสร้างประเภท SUB ประกอบด้วยสมาชิกและคุณลักษณะทั้งหมดจากประเภทวัตถุหลัก

ตัวอย่างที่ 1: ในตัวอย่างด้านล่าง เราจะใช้คุณสมบัติการสืบทอดเพื่อแทรกเรกคอร์ดที่มี ID ผู้จัดการเป็น '1002' ให้กับเรกคอร์ดต่อไปนี้ ('RRR', 1007, 20000)

เราจะดำเนินการตามโปรแกรมข้างต้นตามขั้นตอนต่อไปนี้

  • ขั้นตอนที่ 1: สร้างประเภท SUPER
  • ขั้นตอนที่ 2: สร้างประเภท SUB และเนื้อหา
  • ขั้นตอนที่ 3: การสร้างบล็อกที่ไม่ระบุชื่อเพื่อเรียกประเภท SUB

ขั้นตอน 1) สร้างประเภท SUPER หรือประเภทผู้ปกครอง

การสืบทอดในประเภทวัตถุ

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

คำอธิบายรหัส:

  • รหัสบรรทัด 1-9: การสร้างประเภทวัตถุ 'emp_object' ด้วย 4 แอตทริบิวต์และ 3 สมาชิก ประกอบด้วยคำจำกัดความของตัวสร้างที่มีพารามิเตอร์เพียง 3 ตัวเท่านั้น ได้รับการประกาศว่า 'NOT FINAL' ดังนั้นจึงเป็นประเภทหลัก

ขั้นตอน 2) สร้างประเภท SUB ภายใต้ประเภท SUPER

การสืบทอดในประเภทวัตถุ

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

คำอธิบายรหัส:

  • รหัสบรรทัด 10-13: การสร้าง sub_emp_object เป็นประเภทที่สืบทอดมาโดยมีแอตทริบิวต์ 'default_manager' เพิ่มเติมหนึ่งรายการและการประกาศขั้นตอนสมาชิก
  • รหัสบรรทัดที่ 14: การสร้างเนื้อหาสำหรับประเภทวัตถุที่สืบทอดมา
  • รหัสบรรทัดที่ 16-21: การกำหนดขั้นตอนสมาชิกซึ่งจะแทรกบันทึกลงในตาราง “emp” ด้วยค่าจากประเภทออบเจ็กต์ 'SUPER' ยกเว้นค่าผู้จัดการ สำหรับค่าผู้จัดการ จะใช้ 'default_manager' จากประเภท 'SUB'

ขั้นตอน 3) การสร้างบล็อกที่ไม่ระบุชื่อเพื่อเรียกประเภท SUB

การสืบทอดในประเภทวัตถุ

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

คำอธิบายรหัส:

  • รหัสบรรทัดที่ 25: ประกาศ 'guru_emp_det' เป็นประเภท 'sub_emp_object'
  • รหัสบรรทัดที่ 27: การเริ่มต้นวัตถุด้วยตัวสร้างโดยนัย ตัวสร้างมี 5 พารามิเตอร์ (4 คุณลักษณะจากประเภท PARENT และ 2 คุณลักษณะจากประเภท SUB) พารามิเตอร์สุดท้าย (1002) กำหนดค่าสำหรับแอตทริบิวต์ default_manager
  • รหัสบรรทัดที่ 28: การเรียกสมาชิก 'insert_default_mgr' เพื่อแทรกบันทึกด้วยรหัสผู้จัดการเริ่มต้นที่ส่งผ่านในตัวสร้าง

ความเท่าเทียมกันของวัตถุ PL/SQL

อินสแตนซ์วัตถุที่เป็นของวัตถุเดียวกันสามารถเปรียบเทียบได้เพื่อความเท่าเทียมกัน สำหรับสิ่งนี้ เราจำเป็นต้องมีวิธีพิเศษในประเภทวัตถุที่เรียกว่าวิธี 'ORDER'

เมธอด 'ORDER' นี้ควรเป็นฟังก์ชันที่ส่งคืนประเภทตัวเลข ใช้พารามิเตอร์สองตัวเป็นอินพุต (พารามิเตอร์แรก: id ของอินสแตนซ์อ็อบเจ็กต์ในตัว พารามิเตอร์ตัวที่สอง: id ของอินสแตนซ์อ็อบเจ็กต์อื่น)

มีการเปรียบเทียบ ID ของอินสแตนซ์ออบเจ็กต์ทั้งสอง และผลลัพธ์จะถูกส่งกลับเป็นตัวเลข

  • ค่าบวกแสดงว่าอินสแตนซ์ออบเจ็กต์ SELF มากกว่าอินสแตนซ์อื่น
  • ค่าลบแสดงว่าอินสแตนซ์ออบเจ็กต์ SELF น้อยกว่าอินสแตนซ์อื่น
  • ศูนย์แสดงว่าอินสแตนซ์ออบเจ็กต์ SELF เท่ากับอินสแตนซ์อื่น
  • หากอินสแตนซ์ใดเป็นโมฆะ ฟังก์ชันนี้จะคืนค่าเป็นโมฆะ

ความเท่าเทียมกันของวัตถุ 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;
  .
  .
);
/

คำอธิบายไวยากรณ์:

  • ไวยากรณ์ข้างต้นแสดงฟังก์ชัน ORDER ที่ต้องรวมไว้ในเนื้อหาประเภทเพื่อตรวจสอบความเท่าเทียมกัน
  • พารามิเตอร์สำหรับฟังก์ชันนี้ควรเป็นอินสแตนซ์ของออบเจ็กต์ประเภทเดียวกัน
  • ฟังก์ชันด้านบนสามารถเรียกว่า “obj_instance_1.match(obj_instance_2)” และนิพจน์นี้จะส่งคืนค่าตัวเลขตามที่แสดง โดยที่ obj_instance_1 และ obj_instance_2 เป็นอินสแตนซ์ของ object_type_name

example1:ในตัวอย่างต่อไปนี้ เราจะมาดูวิธีการเปรียบเทียบสองวัตถุ เราจะสร้างอินสแตนซ์สองอินสแตนซ์ และเราจะเปรียบเทียบแอตทริบิวต์ 'salary' ระหว่างทั้งสอง เราจะดำเนินการ int สองขั้นตอน

  • ขั้นตอนที่ 1: การสร้างประเภทวัตถุและเนื้อหา
  • ขั้นตอนที่ 2: การสร้างบล็อกที่ไม่ระบุชื่อเพื่อโทรเปรียบเทียบอินสแตนซ์ออบเจ็กต์

ขั้นตอน 1) การสร้างประเภทวัตถุและเนื้อหา

ความเท่าเทียมกันของวัตถุ PL/SQL

ความเท่าเทียมกันของวัตถุ 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;
/

คำอธิบายรหัส:

  • รหัสบรรทัด 1-4: การสร้างประเภทออบเจ็กต์ 'emp_object_equality' ที่มี 1 แอตทริบิวต์และ 1 สมาชิก
  • รหัสบรรทัด 6-16:การกำหนดฟังก์ชัน ORDER ซึ่งเปรียบเทียบแอตทริบิวต์ 'เงินเดือน' ของอินสแตนซ์ SELF และประเภทอินสแตนซ์พารามิเตอร์ ฟังก์ชันนี้จะคืนค่าเป็นลบหากเงินเดือน SELF น้อยกว่า หรือคืนค่าเป็นบวกหากเงินเดือน SELF มากกว่า และคืนค่าเป็น 0 หากเงินเดือนเท่ากัน

รหัสเอาท์พุท:

สร้างประเภทแล้ว

ขั้นตอน 2) การสร้างบล็อกที่ไม่ระบุชื่อเพื่อเรียกเปรียบเทียบอินสแตนซ์ของวัตถุ

ความเท่าเทียมกันของวัตถุ 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;
/

เอาท์พุต

Salary of second instance is greater

คำอธิบายรหัส:

  • รหัสบรรทัดที่ 20: ประกาศ l_obj_1 ประเภท emp_object_equality
  • รหัสบรรทัดที่ 21: ประกาศ l_obj_2 ประเภท emp_object_equality
  • รหัสบรรทัดที่ 23: กำลังเริ่มต้น l_obj_1 ด้วยมูลค่าเงินเดือนเป็น '15000'
  • รหัสบรรทัดที่ 24: กำลังเริ่มต้น l_obj_1 ด้วยมูลค่าเงินเดือนเป็น '17000'
  • รหัสบรรทัด 25-33: พิมพ์ข้อความตามหมายเลขส่งคืนจากฟังก์ชัน ORDER

สรุป

ในบทนี้ เราได้เห็นประเภทวัตถุและคุณสมบัติของวัตถุแล้ว นอกจากนี้เรายังได้หารือเกี่ยวกับตัวสร้าง สมาชิก คุณลักษณะ การสืบทอด และความเท่าเทียมกันในวัตถุ PL/SQL