Oracle ประเภทอ็อบเจ็กต์ PL/SQL: คำสั่ง CREATE TYPE พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
ประเภทอ็อบเจ็กต์ใน PL/SQL นำมาซึ่งการเขียนโปรแกรมเชิงวัตถุ Oracleช่วยให้คุณสร้างแบบจำลองของสิ่งต่างๆ ในโลกแห่งความเป็นจริงด้วยคุณลักษณะและเมธอดต่างๆ โดยรองรับคอนสตรัคเตอร์ การสืบทอด และการเปรียบเทียบความเท่าเทียมกัน ทำให้ประเภทข้อมูลระดับสคีมาเดียวสามารถจัดเก็บและประมวลผลข้อมูลที่มีโครงสร้างได้

ประเภทวัตถุใน PL/SQL คืออะไร
การเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming) เหมาะอย่างยิ่งสำหรับการสร้างส่วนประกอบที่นำกลับมาใช้ซ้ำได้และแอปพลิเคชันที่ซับซ้อน โปรแกรมจะถูกจัดระเบียบโดยใช้ "วัตถุ" แทนที่จะเป็น "การกระทำ" กล่าวคือ โปรแกรมถูกออกแบบมาให้ทำงานและโต้ตอบกับวัตถุทั้งหมด แทนที่จะเป็นการกระทำเพียงอย่างเดียว แนวทางนี้ช่วยให้นักเขียนโปรแกรมสามารถเติมข้อมูลและจัดการรายละเอียดในระดับวัตถุได้
ภาพด้านล่างแสดงตัวอย่างของประเภทวัตถุ โดยที่บัญชีธนาคารถูกมองว่าเป็นเอนทิตีวัตถุ คุณลักษณะของวัตถุจะเก็บค่าต่างๆ — สำหรับบัญชีธนาคาร ค่าเหล่านี้ได้แก่ หมายเลขบัญชี ยอดเงินคงเหลือ และอื่นๆ — ในขณะที่เมธอดของวัตถุจะอธิบายการกระทำต่างๆ เช่น การคำนวณอัตราดอกเบี้ย หรือการสร้างใบแจ้งยอดบัญชีธนาคาร ซึ่งแต่ละการกระทำนั้นต้องมีกระบวนการจึงจะเสร็จสมบูรณ์
In PL / SQLการเขียนโปรแกรมเชิงวัตถุนั้นอยู่บนพื้นฐานของประเภทวัตถุ ประเภทวัตถุสามารถแทนสิ่งต่างๆ ในโลกแห่งความเป็นจริงได้ หัวข้อด้านล่างนี้จะสำรวจประเภทวัตถุ ส่วนประกอบของประเภทวัตถุ และวิธีการสร้างและใช้งานประเภทวัตถุเหล่านั้น
ส่วนประกอบของประเภทวัตถุ
ประเภทอ็อบเจ็กต์ PL/SQL ประกอบด้วยส่วนประกอบหลักสองส่วน
- คุณสมบัติ
- สมาชิก/วิธีการ
คุณสมบัติ
แอตทริบิวต์คือคอลัมน์หรือฟิลด์ที่ใช้จัดเก็บข้อมูล แต่ละแอตทริบิวต์จะถูกแมปกับชนิดข้อมูลที่กำหนดวิธีการประมวลผลและจัดเก็บข้อมูลสำหรับแอตทริบิวต์นั้น แอตทริบิวต์สามารถมีชนิดข้อมูลใดก็ได้ที่ถูกต้อง ประเภทข้อมูล PL/SQLหรืออาจเป็นวัตถุประเภทอื่นก็ได้
สมาชิก/วิธีการ
สมาชิก หรือวิธีการ คือ โปรแกรมย่อย ตัวแปรสมาชิกถูกกำหนดไว้ภายในประเภทของวัตถุ ตัวแปรเหล่านี้ไม่ได้ใช้สำหรับจัดเก็บข้อมูล แต่ใช้กำหนดกระบวนการที่ดำเนินการภายในประเภทของวัตถุ เช่น การตรวจสอบความถูกต้องของข้อมูลก่อนที่จะเติมข้อมูลลงในวัตถุ ตัวแปรสมาชิกจะถูกประกาศไว้ในข้อกำหนดของประเภทของวัตถุและถูกกำหนดไว้ในส่วนเนื้อหาของประเภทของวัตถุ ส่วนเนื้อหาเป็นส่วนที่ไม่บังคับ: หากไม่มีตัวแปรสมาชิกใดๆ ประเภทของวัตถุจะไม่มีส่วนเนื้อหา
สร้างวัตถุใน Oracle
ไม่สามารถสร้างประเภทอ็อบเจ็กต์ในระดับซับโปรแกรมได้ แต่สามารถสร้างได้เฉพาะในระดับสคีมาเท่านั้น เมื่อกำหนดประเภทอ็อบเจ็กต์ในสคีมาแล้ว ก็สามารถนำไปใช้ในซับโปรแกรมได้ โดยใช้คำสั่ง “CREATE TYPE” ในการสร้างประเภทอ็อบเจ็กต์ และส่วนเนื้อหาของประเภทจะสามารถสร้างได้ก็ต่อเมื่อประเภทอ็อบเจ็กต์นั้นมีอยู่แล้วเท่านั้น
ภาพหน้าจอต่อไปนี้แสดงไวยากรณ์ของคำสั่ง CREATE TYPE สำหรับการกำหนดคุณสมบัติของอ็อบเจ็กต์ และไวยากรณ์ของคำสั่ง CREATE TYPE BODY ที่ใช้กำหนดเมธอดของอ็อบเจ็กต์นั้น
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 ประเภทของอ็อบเจ็กต์จะต้องได้รับการประกาศก่อนที่จะนำไปใช้ในโปรแกรม เมื่อสร้างประเภทของอ็อบเจ็กต์แล้ว ก็สามารถนำไปใช้ในส่วนการประกาศของโปรแกรมย่อยเพื่อประกาศตัวแปรของประเภทอ็อบเจ็กต์นั้นได้
เมื่อใดก็ตามที่ตัวแปรถูกประกาศเป็นชนิดอ็อบเจ็กต์ ในระหว่างการทำงาน ระบบจะสร้างอินสแตนซ์ใหม่ของชนิดอ็อบเจ็กต์นั้นขึ้นมา และอินสแตนซ์ที่สร้างขึ้นใหม่นี้จะถูกอ้างอิงโดยชื่อของตัวแปร ด้วยวิธีนี้ ชนิดอ็อบเจ็กต์เดียวสามารถจัดเก็บค่าได้หลายค่าภายใต้อินสแตนซ์ที่แตกต่างกัน
ภาพหน้าจอด้านล่างแสดงการประกาศตัวแปรเป็นประเภทอ็อบเจ็กต์ภายใน บล็อก PL/SQL.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
คำอธิบายไวยากรณ์:
- ไวยากรณ์ข้างต้นแสดงถึงการประกาศตัวแปร ตัวแปร ในฐานะประเภทวัตถุในส่วนการประกาศ
เมื่อตัวแปรถูกประกาศเป็นชนิดอ็อบเจ็กต์ในโปรแกรมย่อยแล้ว ตัวแปรนั้นจะมีค่าเริ่มต้นเป็น null โดยสมบูรณ์ กล่าวคือ อ็อบเจ็กต์ทั้งหมดจะมีค่าเป็น null จึงต้องกำหนดค่าเริ่มต้นให้กับตัวแปรก่อนจึงจะสามารถใช้งานได้ในโปรแกรม การกำหนดค่าเริ่มต้นให้กับอ็อบเจ็กต์ทำได้โดยใช้คอนสตรัคเตอร์
คอนสตรัคเตอร์เป็นเมธอดโดยปริยายของอ็อบเจ็กต์ ซึ่งสามารถอ้างอิงได้โดยใช้ชื่อเดียวกับชนิดของอ็อบเจ็กต์ ภาพหน้าจอด้านล่างแสดงการเริ่มต้นใช้งานอินสแตนซ์ของชนิดอ็อบเจ็กต์
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
คำอธิบายไวยากรณ์:
- ไวยากรณ์ข้างต้นแสดงการกำหนดค่าเริ่มต้นให้กับอินสแตนซ์ของประเภทอ็อบเจ็กต์ด้วยค่าว่าง (null)
- เมื่อกำหนดค่าเริ่มต้นให้กับอ็อบเจ็กต์แล้ว อ็อบเจ็กต์นั้นจะไม่เป็นค่าว่างอีกต่อไป แต่แอตทริบิวต์ภายในอ็อบเจ็กต์จะยังคงเป็นค่าว่างจนกว่าจะมีการกำหนดค่าให้กับแอตทริบิวต์เหล่านั้น
ตัวสร้าง
คอนสตรัคเตอร์คือเมธอดโดยปริยายของอ็อบเจ็กต์ ซึ่งสามารถอ้างอิงได้โดยใช้ชื่อเดียวกับชนิดของอ็อบเจ็กต์ เมื่อใดก็ตามที่มีการอ้างอิงถึงอ็อบเจ็กต์เป็นครั้งแรก คอนสตรัคเตอร์นี้จะถูกเรียกใช้งานโดยปริยาย
นอกจากนี้ คุณยังสามารถเริ่มต้นใช้งานอ็อบเจ็กต์โดยใช้คอนสตรัคเตอร์เหล่านี้ได้ สามารถกำหนดคอนสตรัคเตอร์ได้อย่างชัดเจนโดยการกำหนดสมาชิกในส่วนเนื้อหาของประเภทอ็อบเจ็กต์โดยใช้ชื่อเดียวกันกับประเภทอ็อบเจ็กต์
1 ตัวอย่าง: ในตัวอย่างต่อไปนี้ เราใช้สมาชิกประเภทอ็อบเจ็กต์เพื่อแทรกเรคอร์ดลงในตาราง emp ด้วยค่า ('RRR', 1005, 20000, 1000) และ ('PPP', 1006, 20000, 1001) เมื่อแทรกข้อมูลแล้ว เราจะแสดงข้อมูลโดยใช้สมาชิกประเภทอ็อบเจ็กต์ นอกจากนี้ เรายังใช้คอนสตรัคเตอร์แบบระบุชัดเจนเพื่อกำหนดค่าเริ่มต้น 1001 ให้กับรหัสผู้จัดการสำหรับเรคอร์ดที่สอง
เราดำเนินการตามขั้นตอนต่อไปนี้
- ขั้นตอนที่ 1: สร้างประเภท Object และส่วนเนื้อหาของประเภท Object
- ขั้นตอนที่ 2: สร้างบล็อกนิรนามเพื่อเรียกใช้ประเภทอ็อบเจ็กต์ผ่านคอนสตรัคเตอร์โดยปริยายสำหรับ emp_no 1005
- ขั้นตอนที่ 3: สร้างบล็อกนิรนามเพื่อเรียกใช้ประเภทอ็อบเจ็กต์ผ่านคอนสตรัคเตอร์ที่ระบุอย่างชัดเจนสำหรับ emp_no 1006
ขั้นตอนที่ 1) สร้างประเภทอ็อบเจ็กต์และส่วนเนื้อหาของประเภทอ็อบเจ็กต์
ภาพหน้าจอด้านล่างแสดงการสร้างข้อมูลจำเพาะของประเภทอ็อบเจ็กต์ emp_object พร้อมด้วยแอตทริบิวต์และสมาชิกต่างๆ
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); /
ภาพหน้าจอด้านล่างแสดงโครงสร้างของประเภท emp_object ที่สร้างขึ้นโดยใช้คอนสตรัคเตอร์แบบระบุชัดเจนและขั้นตอนสมาชิก
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 คำอธิบาย
- Code บรรทัดที่ 1-9: สร้างประเภทอ็อบเจ็กต์ 'emp_object' ที่มี 4 แอตทริบิวต์และ 3 สมาชิก โดยมีนิยามของคอนสตรัคเตอร์ที่มีพารามิเตอร์เพียง 3 ตัว (คอนสตรัคเตอร์โดยปริยายที่แท้จริงจะมีจำนวนพารามิเตอร์เท่ากับจำนวนแอตทริบิวต์ที่มีอยู่ในประเภทอ็อบเจ็กต์)
- Code สาย 10: กำลังสร้างเนื้อหาตัวอักษร
- Code บรรทัดที่ 11-21: กำหนดคอนสตรัคเตอร์แบบชัดเจน กำหนดค่าพารามิเตอร์ให้กับแอตทริบิวต์ และกำหนดค่าเริ่มต้นให้กับแอตทริบิวต์ 'manager' เป็น '1001'
- Code บรรทัดที่ 22-26: กำหนดสมาชิก 'insert_records' ซึ่งค่าแอตทริบิวต์จะถูกแทรกเข้าไปในตาราง 'emp'
- Code บรรทัดที่ 27-34: การกำหนดสมาชิก 'display_records' ซึ่งจะแสดงค่าของแอตทริบิวต์ประเภทวัตถุ
Output:
สร้างประเภทแล้ว
ประเภทเนื้อหาที่สร้างขึ้น
ขั้นตอน 2) สร้างบล็อกนิรนามเพื่อเรียกใช้ประเภทอ็อบเจ็กต์ที่สร้างขึ้นผ่านตัวสร้างโดยปริยายสำหรับ emp_no 1005
ภาพหน้าจอด้านล่างแสดงบล็อกที่ไม่ระบุชื่อซึ่งเรียกใช้ emp_object ผ่านคอนสตรัคเตอร์โดยปริยาย
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 คำอธิบาย
- Code บรรทัดที่ 37-45: การแทรกข้อมูลโดยใช้คอนสตรัคเตอร์แบบไม่ระบุชื่อ การเรียกใช้คอนสตรัคเตอร์จะมีค่าแอตริบิวต์จำนวนจริงอยู่ด้วย
- Code สาย 38: ประกาศตัวแปร 'guru_emp_det' เป็นประเภทอ็อบเจ็กต์ 'emp_object'
- Code สาย 41: คำสั่ง 'guru_emp_det.display_records' เรียกใช้เมธอด 'display_records' และแสดงค่าแอตทริบิวต์
- Code สาย 42: คำสั่ง 'guru_emp_det.insert_records' เรียกใช้เมธอด 'insert_records' และค่าแอตทริบิวต์จะถูกแทรกเข้าไปในตาราง จากนั้นบล็อกจะทำการยืนยันการเปลี่ยนแปลง การทำธุกรรม.
Output:
ชื่อพนักงาน: RRR
หมายเลขพนักงาน: 1005
เงินเดือน: 20000
ผู้จัดการ : 1000
ขั้นตอน 3) สร้างบล็อกนิรนามเพื่อเรียกใช้ประเภทอ็อบเจ็กต์ที่สร้างขึ้นผ่านตัวสร้างที่ระบุอย่างชัดเจนสำหรับ emp_no 1006
ภาพหน้าจอด้านล่างแสดงบล็อกโค้ดที่ไม่ระบุชื่อ ซึ่งเรียกใช้ emp_object ผ่านคอนสตรัคเตอร์ที่ระบุอย่างชัดเจนพร้อมอาร์กิวเมนต์สามตัว
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
Code คำอธิบาย:
- Code บรรทัดที่ 46-53: การแทรกเรคอร์ดโดยใช้ตัวสร้างแบบระบุชัดเจน
- Code สาย 46: ประกาศตัวแปร 'guru_emp_det' เป็นประเภทอ็อบเจ็กต์ 'emp_object'
- Code สาย 50: คำสั่ง 'guru_emp_det.display_records' เรียกใช้เมธอด 'display_records' และแสดงค่าแอตทริบิวต์
- Code สาย 51: คำสั่ง 'guru_emp_det.insert_records' เรียกใช้เมธอด 'insert_records' และค่าแอตทริบิวต์จะถูกแทรกเข้าไปในตาราง เนื่องจากมีการส่งอาร์กิวเมนต์เพียงสามตัว คอนสตรัคเตอร์แบบชัดเจนจึงตั้งค่ารหัสผู้จัดการเป็นค่าเริ่มต้น 1001
การสืบทอดในประเภทวัตถุ
คุณสมบัติการสืบทอดช่วยให้ประเภทของอ็อบเจ็กต์ย่อยสามารถเข้าถึงแอตทริบิวต์และสมาชิกทั้งหมดของประเภทของอ็อบเจ็กต์หลักหรือประเภทของอ็อบเจ็กต์แม่ได้
ประเภทวัตถุย่อยเรียกว่าประเภทวัตถุที่สืบทอด และประเภทวัตถุหลักเรียกว่าประเภทวัตถุแม่ ไวยากรณ์ด้านล่างแสดงวิธีการสร้างประเภทวัตถุแม่และประเภทวัตถุที่สืบทอด ภาพหน้าจอด้านล่างแสดงไวยากรณ์ของประเภทวัตถุแม่ (SUPER) ที่ทำเครื่องหมายว่า NOT FINAL
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
คำอธิบายไวยากรณ์:
- ไวยากรณ์ข้างต้นแสดงการสร้างประเภท SUPER ส่วนคำสั่ง NOT FINAL อนุญาตให้สืบทอดประเภทนี้ได้
ภาพหน้าจอด้านล่างแสดงไวยากรณ์ประเภทสืบทอด (SUB) ที่สร้างขึ้นด้วยคำหลัก UNDER
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
คำอธิบายไวยากรณ์:
- ไวยากรณ์ข้างต้นแสดงการสร้างประเภท SUB ซึ่งประกอบด้วยสมาชิกและแอตทริบิวต์ทั้งหมดจากประเภทออบเจ็กต์หลัก
1 ตัวอย่าง: ในตัวอย่างด้านล่าง เราใช้คุณสมบัติการสืบทอดเพื่อแทรกเรคอร์ดที่มีรหัสผู้จัดการ '1002' สำหรับเรคอร์ด ('RRR', 1007, 20000) เราดำเนินการโปรแกรมตามขั้นตอนต่อไปนี้
- ขั้นตอนที่ 1: สร้างประเภท SUPER
- ขั้นตอนที่ 2: สร้างประเภท SUB และเนื้อหา
- ขั้นตอนที่ 3: สร้างบล็อกที่ไม่ระบุชื่อเพื่อเรียกใช้ประเภท SUB
ขั้นตอนที่ 1) สร้างประเภท SUPER หรือประเภทแม่
ภาพหน้าจอด้านล่างแสดงให้เห็นการสร้างคลาสแม่ emp_object โดยใช้เงื่อนไข 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 คำอธิบาย:
- Code บรรทัดที่ 1-9: สร้างอ็อบเจ็กต์ประเภท 'emp_object' ที่มี 4 แอตทริบิวต์และ 3 สมาชิก โดยมีนิยามของคอนสตรัคเตอร์ที่มีพารามิเตอร์เพียง 3 ตัว และได้ประกาศเป็น 'NOT FINAL' ดังนั้นจึงเป็นประเภทแม่ (parent type)
ขั้นตอนที่ 2) สร้างประเภทย่อย (SUB type) ภายใต้ประเภทหลัก (SUPER type)
ภาพหน้าจอด้านล่างแสดงประเภทสืบทอด sub_emp_object และส่วนเนื้อหาที่กำลังสร้างขึ้น
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 คำอธิบาย:
- Code บรรทัดที่ 10-13: สร้าง 'sub_emp_object' เป็นประเภทที่สืบทอดมา โดยมีแอตทริบิวต์เพิ่มเติมอีกหนึ่งรายการคือ 'default_manager' และการประกาศขั้นตอนสมาชิก
- Code สาย 14: สร้างเนื้อหาสำหรับประเภทวัตถุที่สืบทอดมา
- Code บรรทัดที่ 16-21: กำหนดขั้นตอนสมาชิกที่แทรกเรคอร์ดลงในตาราง 'emp' โดยใช้ค่าจากประเภทออบเจ็กต์ SUPER ยกเว้นค่าผู้จัดการ สำหรับค่าผู้จัดการนั้น จะใช้ค่า 'default_manager' จากประเภท SUB แทน
ขั้นตอนที่ 3) สร้างบล็อกนิรนามเพื่อเรียกใช้ประเภท SUB
ภาพหน้าจอด้านล่างแสดงบล็อกที่ไม่ระบุชื่อซึ่งเรียกใช้ประเภท SUB และแทรก ID ผู้จัดการเริ่มต้น
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 คำอธิบาย:
- Code สาย 25: ประกาศตัวแปร 'guru_emp_det' เป็นชนิด 'sub_emp_object'
- Code สาย 27: เริ่มต้นใช้งานอ็อบเจ็กต์ด้วยคอนสตรัคเตอร์แบบไม่ระบุชื่อ คอนสตรัคเตอร์นี้มีพารามิเตอร์ 5 ตัว (แอตทริบิวต์ 4 ตัวจากประเภท PARENT และแอตทริบิวต์ 1 ตัวจากประเภท SUB) พารามิเตอร์ตัวสุดท้าย (1002) กำหนดค่าสำหรับแอตทริบิวต์ default_manager
- Code สาย 28: เรียกใช้เมธอด 'insert_default_mgr' เพื่อแทรกเรคอร์ดโดยใช้รหัสผู้จัดการเริ่มต้นที่ส่งมาในคอนสตรัคเตอร์
ความเท่าเทียมกันของวัตถุ PL/SQL
อินสแตนซ์ของอ็อบเจ็กต์ที่อยู่ในประเภทอ็อบเจ็กต์เดียวกันสามารถเปรียบเทียบความเท่าเทียมกันได้ ในการทำเช่นนั้น ประเภทอ็อบเจ็กต์นั้นจำเป็นต้องมีเมธอดพิเศษที่เรียกว่าเมธอด ORDER
เมธอด ORDER นี้ควรเป็นฟังก์ชันที่ส่งคืนค่าประเภทตัวเลข โดยรับพารามิเตอร์สองตัวเป็นอินพุต (พารามิเตอร์แรก: รหัสประจำตัวของอินสแตนซ์ของอ็อบเจ็กต์ตัวเอง; พารามิเตอร์ที่สอง: รหัสประจำตัวของอินสแตนซ์ของอ็อบเจ็กต์อื่น)
ระบบจะเปรียบเทียบรหัสประจำตัวของอ็อบเจ็กต์ทั้งสอง และส่งคืนผลลัพธ์เป็นตัวเลข
- ค่าบวกแสดงว่าอินสแตนซ์ของอ็อบเจ็กต์ SELF มีขนาดใหญ่กว่าอินสแตนซ์อื่น
- ค่าลบแสดงว่าอินสแตนซ์ของอ็อบเจ็กต์ SELF มีค่าน้อยกว่าอินสแตนซ์อื่น
- ค่าศูนย์แสดงว่าอินสแตนซ์ของอ็อบเจ็กต์ SELF เท่ากับอินสแตนซ์อื่น
- หากอินสแตนซ์ใดอินสแตนซ์หนึ่งเป็นค่าว่าง ฟังก์ชันจะส่งคืนค่าว่าง
ภาพหน้าจอด้านล่างแสดงไวยากรณ์ของฟังก์ชันสมาชิก ORDER ที่ต้องรวมอยู่ในส่วนเนื้อหาของประเภทสำหรับการตรวจสอบความเท่าเทียมกัน
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 คืออินสแตนซ์ของประเภทอ็อบเจ็กต์
1 ตัวอย่าง: ในตัวอย่างต่อไปนี้ เราจะเปรียบเทียบวัตถุสองชิ้น เราสร้างอินสแตนซ์สองตัวและเปรียบเทียบคุณลักษณะ 'เงินเดือน' ระหว่างอินสแตนซ์ทั้งสอง โดยทำในสองขั้นตอน
- ขั้นตอนที่ 1: สร้างประเภทและโครงสร้างของอ็อบเจ็กต์
- ขั้นตอนที่ 2: สร้างบล็อกนิรนามเพื่อเปรียบเทียบอินสแตนซ์ของอ็อบเจ็กต์
ขั้นตอนที่ 1) การสร้างประเภทและโครงสร้างของอ็อบเจ็กต์
ภาพหน้าจอที่แสดงด้านล่างแสดงรายละเอียดของ emp_object_equality และส่วนเนื้อหา ซึ่งกำหนดฟังก์ชัน ORDER ที่ใช้เปรียบเทียบคุณลักษณะเงินเดือน
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 คำอธิบาย:
- Code บรรทัดที่ 1-4: สร้างประเภทอ็อบเจ็กต์ 'emp_object_equality' โดยมีแอตทริบิวต์ 1 รายการและสมาชิก 1 รายการ
- Code บรรทัดที่ 6-16: กำหนดฟังก์ชัน ORDER ที่ใช้เปรียบเทียบแอตทริบิวต์ 'salary' ของอินสแตนซ์ SELF กับอินสแตนซ์พารามิเตอร์ โดยจะส่งคืนค่าลบหากเงินเดือนของ SELF น้อยกว่า ค่าบวกหากเงินเดือนของ SELF มากกว่า และ 0 หากเงินเดือนเท่ากัน
Code Output:
สร้างประเภทแล้ว
ขั้นตอนที่ 2) สร้างบล็อกนิรนามเพื่อเปรียบเทียบอินสแตนซ์ของอ็อบเจ็กต์
ภาพหน้าจอด้านล่างแสดงบล็อกที่ไม่ระบุชื่อซึ่งเปรียบเทียบอินสแตนซ์ emp_object_equality สองตัวโดยใช้เงินเดือน
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; /
เอาท์พุต
Salary of second instance is greater
Code คำอธิบาย:
- Code สาย 20: ประกาศตัวแปร 'l_obj_1' ชนิด 'emp_object_equality'
- Code สาย 21: ประกาศตัวแปร 'l_obj_2' ชนิด 'emp_object_equality'
- Code สาย 23: กำลังกำหนดค่าเริ่มต้นให้กับ 'l_obj_1' ด้วยค่าเงินเดือน '15000'
- Code สาย 24: กำลังกำหนดค่าเริ่มต้นให้กับ 'l_obj_2' ด้วยค่าเงินเดือน '17000'
- Code บรรทัดที่ 25-33: พิมพ์ข้อความตามหมายเลขที่ได้จากฟังก์ชัน ORDER


















