Oracle ประเภทอ็อบเจ็กต์ PL/SQL: คำสั่ง CREATE TYPE พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 🧱 ส่วนประกอบประเภทวัตถุ: ประเภทวัตถุประกอบด้วยแอตทริบิวต์ที่ใช้เก็บข้อมูล และสมาชิกหรือเมธอดที่ใช้กำหนดตรรกะการประมวลผล
  • 🏗️ สร้างวัตถุ: ประเภทของอ็อบเจ็กต์ถูกสร้างขึ้นในระดับสคีมาด้วยคำสั่ง CREATE TYPE และเมธอดของอ็อบเจ็กต์เหล่านั้นจะถูกกำหนดไว้ในส่วน BODY ของคำสั่ง CREATE TYPE แยกต่างหาก
  • 🔧 ตัวสร้าง: วัตถุทุกประเภทจะมีคอนสตรัคเตอร์โดยปริยายซึ่งตั้งชื่อตามประเภทของวัตถุนั้น และคุณสามารถกำหนดคอนสตรัคเตอร์โดยชัดเจนเพื่อกำหนดค่าเริ่มต้นได้
  • 🧬 มรดก: ประเภทแม่ที่ไม่ใช่ประเภทสุดท้าย (NOT FINAL) จะถูกขยายด้วยประเภทใต้ (UNDER) ดังนั้นประเภทย่อยจะสืบทอดคุณลักษณะและสมาชิกทั้งหมดจากประเภทแม่
  • 🇧🇷 ความเท่าเทียมกัน: ฟังก์ชันสมาชิก ORDER จะเปรียบเทียบอินสแตนซ์ของอ็อบเจ็กต์สองตัวและส่งคืนค่าลบ ศูนย์ หรือบวก
  • 🤖 ความช่วยเหลือจาก AI: ผู้ช่วย AI เช่น GitHub Copilot สามารถร่างคำจำกัดความ CREATE TYPE, คอนสตรัคเตอร์ และเมธอด ORDER จากความคิดเห็นได้

Oracle ประเภทอ็อบเจ็กต์ PL/SQL ที่แสดงคำสั่ง CREATE TYPE พร้อมแอตทริบิวต์และเมธอด

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

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

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

บัญชีธนาคารถูกจำลองเป็นประเภทอ็อบเจ็กต์ที่มีแอตทริบิวต์และเมธอดในภาษา PL/SQL

In PL / SQLการเขียนโปรแกรมเชิงวัตถุนั้นอยู่บนพื้นฐานของประเภทวัตถุ ประเภทวัตถุสามารถแทนสิ่งต่างๆ ในโลกแห่งความเป็นจริงได้ หัวข้อด้านล่างนี้จะสำรวจประเภทวัตถุ ส่วนประกอบของประเภทวัตถุ และวิธีการสร้างและใช้งานประเภทวัตถุเหล่านั้น

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

ประเภทอ็อบเจ็กต์ PL/SQL ประกอบด้วยส่วนประกอบหลักสองส่วน

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

คุณสมบัติ

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

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

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

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

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

ภาพหน้าจอต่อไปนี้แสดงไวยากรณ์ของคำสั่ง CREATE TYPE สำหรับการกำหนดคุณสมบัติของอ็อบเจ็กต์ และไวยากรณ์ของคำสั่ง CREATE TYPE BODY ที่ใช้กำหนดเมธอดของอ็อบเจ็กต์นั้น

ไวยากรณ์ CREATE TYPE ที่ใช้กำหนดคุณสมบัติของอ็อบเจ็กต์ด้วยแอตทริบิวต์ต่างๆ Oracle ไวยากรณ์ CREATE TYPE BODY ที่ใช้กำหนดเมธอดของประเภทอ็อบเจ็กต์ PL/SQL

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.

การประกาศตัวแปรชนิดอ็อบเจ็กต์ในส่วนประกาศของบล็อก 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 พร้อมด้วยแอตทริบิวต์และสมาชิกต่างๆ

การสร้างข้อมูลจำเพาะของประเภทอ็อบเจ็กต์ 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 ที่สร้างขึ้นโดยใช้คอนสตรัคเตอร์แบบระบุชัดเจนและขั้นตอนสมาชิก

การกำหนดเนื้อหาประเภท 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 ผ่านคอนสตรัคเตอร์โดยปริยาย

บล็อกนิรนามเรียก emp_object ผ่านคอนสตรัคเตอร์โดยปริยายสำหรับ 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;

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 ผ่านคอนสตรัคเตอร์ที่ระบุอย่างชัดเจนพร้อมอาร์กิวเมนต์สามตัว

บล็อกนิรนามเรียก emp_object ผ่านคอนสตรัคเตอร์ที่ระบุอย่างชัดเจนสำหรับ 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

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 สำหรับประเภทอ็อบเจ็กต์แม่ที่ไม่ใช่ FINAL ที่ใช้ในการสืบทอด

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

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

  • ไวยากรณ์ข้างต้นแสดงการสร้างประเภท SUPER ส่วนคำสั่ง NOT FINAL อนุญาตให้สืบทอดประเภทนี้ได้

ภาพหน้าจอด้านล่างแสดงไวยากรณ์ประเภทสืบทอด (SUB) ที่สร้างขึ้นด้วยคำหลัก UNDER

ไวยากรณ์ CREATE TYPE 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

สร้างคลาสแม่ 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 และส่วนเนื้อหาที่กำลังสร้างขึ้น

สร้างประเภทสืบทอด sub_emp_object และส่วนเนื้อหาโดยใช้ insert_default_mgr

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 ผู้จัดการเริ่มต้น

บล็อกนิรนามที่เรียกใช้ประเภท sub_emp_object เพื่อแทรก 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 ที่ต้องรวมอยู่ในส่วนเนื้อหาของประเภทสำหรับการตรวจสอบความเท่าเทียมกัน

ไวยากรณ์ของฟังก์ชันสมาชิก 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 ที่ใช้เปรียบเทียบคุณลักษณะเงินเดือน

การสร้างข้อกำหนดประเภทวัตถุ emp_object_equality ด้วยฟังก์ชัน ORDER กำหนดเนื้อหาประเภท emp_object_equality ที่ใช้เปรียบเทียบคุณลักษณะเงินเดือน

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 สองตัวโดยใช้เงินเดือน

บล็อกนิรนามที่เปรียบเทียบอินสแตนซ์ 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

คำถามที่พบบ่อย

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

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

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

ประเภท NOT INSTANTIABLE ไม่สามารถสร้างอ็อบเจ็กต์ได้โดยตรง มันทำหน้าที่เสมือนเป็นประเภท abstracเป็นพื้นฐานที่ประเภทอื่นๆ ขยายต่อยอด เมื่อรวมกับ NOT FINAL จะกำหนดซูเปอร์ไทป์ที่มีซับไทป์เป็นตัวกำหนดการใช้งานจริงของเมธอดที่ประกาศไว้

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

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

ใช่. นักบิน GitHub สร้างร่างข้อกำหนด CREATE TYPE, เมธอด TYPE BODY, คอนสตรัคเตอร์ และฟังก์ชัน ORDER จากข้อความแสดงความคิดเห็น Revตรวจสอบประเภทข้อมูลของแอตทริบิวต์ พารามิเตอร์ของตัวสร้าง และข้อกำหนดการสืบทอดก่อนที่จะใช้งานประเภทที่สร้างขึ้น

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

สรุปโพสต์นี้ด้วย: