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

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

ประเภทข้อมูล Record ใน PL/SQL เป็นประเภทข้อมูลที่ซับซ้อนซึ่งรวมคอลัมน์หลายคอลัมน์ โดยแต่ละคอลัมน์มีชื่อและประเภทข้อมูลของตนเอง เข้าไว้ในประเภทใหม่เดียว สามารถกำหนดเรคอร์ดได้ทั้งในระดับฐานข้อมูลในรูปแบบของอ็อบเจ็กต์ที่จัดเก็บไว้ หรือภายในโปรแกรมย่อย และสามารถเข้าถึงฟิลด์ต่างๆ ได้โดยใช้ตัวดำเนินการจุด (dot operator)

  • 🧱 ความหมาย: ประเภทเรคอร์ดจะรวมคอลัมน์ตั้งแต่หนึ่งคอลัมน์ขึ้นไปเข้าไว้ในประเภทข้อมูลใหม่ประเภทเดียว
  • 🔑 คำที่เกี่ยวข้อง: คีย์เวิร์ด TYPE บอกคอมไพเลอร์ว่ากำลังสร้างชนิดข้อมูลใหม่
  • 🏛️ สองระดับ: เรคอร์ดระดับฐานข้อมูลคือวัตถุที่ถูกจัดเก็บไว้ ในขณะที่เรคอร์ดระดับโปรแกรมย่อยจะมองเห็นได้เฉพาะภายในโปรแกรมย่อยนั้นเท่านั้น
  • 🔗 การเข้าถึงพื้นที่ภาคสนาม: สามารถเข้าถึงฟิลด์ได้โดยใช้รูปแบบ record_variable.column_name โดยใช้ตัวดำเนินการจุด (dot operator)
  • 📥 ระดับคอลัมน์: สามารถกำหนดค่าให้กับฟิลด์ได้ครั้งละหนึ่งฟิลด์เท่านั้น
  • 📦 ระดับแถว: คำสั่ง SELECT INTO สามารถดึงข้อมูลทั้งระเบียนจากแถวในตารางได้
  • 🧩 ประเภทของบันทึก: %ROWTYPE แบบตาราง, %ROWTYPE แบบเคอร์เซอร์ และเรคอร์ดที่โปรแกรมเมอร์กำหนดเอง

Oracle ประเภทระเบียน PL/SQL

ประเภทบันทึกคืออะไร?

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

  • เป็นการรวมคอลัมน์ตั้งแต่หนึ่งคอลัมน์ขึ้นไปเพื่อสร้างชนิดข้อมูลใหม่
  • แต่ละคอลัมน์เหล่านี้มีชื่อและชนิดข้อมูลเฉพาะของตนเอง
  • ประเภทระเบียนสามารถรับข้อมูลได้ในรูปแบบระเบียนเดียวที่ประกอบด้วยหลายคอลัมน์ หรือสามารถรับค่าสำหรับคอลัมน์ใดคอลัมน์หนึ่งของระเบียนก็ได้
  • ประเภทเรคอร์ดเป็นเพียงประเภทข้อมูลใหม่ เมื่อสร้างแล้ว จะถูกจัดเก็บเป็นประเภทข้อมูลใหม่และสามารถใช้เพื่อประกาศตัวแปรในโปรแกรมได้
  • มันใช้คำหลัก 'พิมพ์' เพื่อแจ้งให้คอมไพเลอร์ทราบว่ากำลังสร้างชนิดข้อมูลใหม่
  • สามารถสร้างได้ที่ ระดับฐานข้อมูลจัดเก็บเป็นอ็อบเจ็กต์ในฐานข้อมูลและใช้งานทั่วทั้งฐานข้อมูล หรือที่ระดับหนึ่ง ระดับโปรแกรมย่อยสามารถมองเห็นได้เฉพาะภายในโปรแกรมย่อยเท่านั้น
  • นอกจากนี้ยังสามารถประกาศชนิดข้อมูลระดับฐานข้อมูลสำหรับคอลัมน์ของตารางได้ เพื่อให้คอลัมน์เดียวสามารถเก็บข้อมูลที่ซับซ้อนได้
  • การเข้าถึงข้อมูลทำได้โดยการอ้างอิงชื่อตัวแปร ตามด้วยเครื่องหมายจุด (.) แล้วตามด้วยชื่อคอลัมน์ เช่น ' . '.

ไวยากรณ์สำหรับการประกาศประเภทเรคอร์ด

ไวยากรณ์สำหรับการประกาศในระดับฐานข้อมูล:

การประกาศประเภทเรคอร์ดในระดับฐานข้อมูล

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

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

ไวยากรณ์สำหรับการประกาศในระดับโปรแกรมย่อย:

การประกาศประเภทเรคอร์ดในระดับซับโปรแกรม

DECLARE
TYPE <type_name> IS RECORD
(
<column1> <datatype>,
);
BEGIN
<execution_section>;
END;

ในไวยากรณ์นี้ เราสร้างชนิดเรคอร์ดชื่อ “type_name” เฉพาะภายในโปรแกรมย่อยเท่านั้น วิธีการกำหนดคอลัมน์และชนิดข้อมูลในทั้งสองวิธีนั้นคล้ายคลึงกัน

ตัวอย่างที่ 1: ประเภทเรคอร์ดในฐานะอ็อบเจ็กต์ฐานข้อมูล

ในโปรแกรมนี้ เราจะเรียนรู้วิธีการสร้างประเภทเรคอร์ดเป็นอ็อบเจ็กต์ในฐานข้อมูล เราสร้างประเภทเรคอร์ด 'emp_det' ที่มีสี่คอลัมน์ โดยคอลัมน์และประเภทข้อมูลมีดังนี้:

  • EMP_NO (NUMBER)
  • EMP_NAME (VARCHAR2 (150))
  • ผู้จัดการ (หมายเลข)
  • เงินเดือน (จำนวน)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

Output:

Type created

Code คำอธิบาย

  • โค้ดด้านบนสร้างชนิดข้อมูล emp_det เป็นอ็อบเจ็กต์ในฐานข้อมูล
  • ประกอบด้วย 4 คอลัมน์ ได้แก่ หมายเลขพนักงาน ชื่อพนักงาน ผู้จัดการ และเงินเดือน ตามที่กำหนดไว้
  • ตอนนี้ 'emp_det' ก็เหมือนกับตัวแปรอื่นๆ ทั่วไป ประเภทข้อมูล (เช่นเดียวกับ NUMBER หรือ VARCHAR2) และสามารถมองเห็นได้ทั่วทั้งฐานข้อมูล ดังนั้นจึงสามารถใช้ประกาศตัวแปรประเภทนี้ได้ทุกที่ในฐานข้อมูล

ตัวอย่างที่ 2: การเข้าถึงระดับโปรแกรมย่อย ระดับคอลัมน์

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

ตัวอย่างการเข้าถึงระดับคอลัมน์ของประเภทเรคอร์ด

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
guru99_emp_rec.emp_no:= 1001;
guru99_emp_rec.emp_name:= 'XXX';
guru99_emp_rec.manager:= 1000;
guru99_emp_rec.salary:= 10000;
dbms_output.put_line('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Output:

Employee Detail
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000

Code คำอธิบาย

  • Code บรรทัดที่ 2-8: มีการประกาศชนิดข้อมูล 'emp_det' โดยมีคอลัมน์ emp_no, emp_name, manager และ salary ซึ่งมีชนิดข้อมูลเป็น NUMBER, VARCHAR2, NUMBER และ NUMBER ตามลำดับ
  • Code สาย 9: ตัวแปร guru99_emp_rec ถูกประกาศเป็นชนิดข้อมูล 'emp_det' ตัวแปร สามารถเก็บค่าที่มีฟิลด์ทั้งสี่อยู่ภายในได้
  • Code สาย 11: กำลังเติมข้อมูลในช่อง 'emp_no' ของ 'guru99_emp_rec' ด้วยค่า 1001
  • Code สาย 12: กรอกค่า XXX ลงในช่อง 'emp_name'
  • Code สาย 13: กรอกค่า 1000 ลงในช่อง 'ผู้จัดการ'
  • Code สาย 14: กรอกค่า 10000 ลงในช่อง 'เงินเดือน'
  • Code บรรทัดที่ 15-19: แสดงค่าของ 'guru99_emp_rec' ในผลลัพธ์

ตัวอย่างที่ 3: การเข้าถึงระดับแถวในระดับโปรแกรมย่อย

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

ตัวอย่างการเข้าถึงระดับแถวของประเภทเรคอร์ด

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
COMMIT;
SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002;
dbms_output.put_line ('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Code คำอธิบาย

  • Code บรรทัดที่ 2-8: มีการประกาศชนิดข้อมูล 'emp_det' โดยมีคอลัมน์ emp_no, emp_name, manager และ salary ซึ่งมีชนิดข้อมูลเป็น NUMBER, VARCHAR2, NUMBER และ NUMBER ตามลำดับ
  • Code สาย 9: ตัวแปร guru99_emp_rec ถูกประกาศเป็นชนิดข้อมูล 'emp_det' และสามารถเก็บค่าได้ทั้งสี่ฟิลด์
  • Code สาย 11: กรอกข้อมูลลงในตาราง emp โดยกำหนดค่า 1002 เป็น emp_no, YYY เป็น emp_name, 15000 เป็น salary และ 1000 เป็น manager number
  • Code สาย 12: ยืนยันธุรกรรมการแทรก
  • Code สาย 13: กำหนดค่าให้กับตัวแปร 'guru99_emp_rec' ในระดับแถวจากคำสั่ง SELECT สำหรับพนักงานหมายเลข 1002
  • Code บรรทัดที่ 15-19: แสดงค่าของ 'guru99_emp_rec' ในผลลัพธ์

Output:

Employee Detail
Employee Number: 1002
Employee Name: YYY
Employee Salary: 1000
Employee Manager Number: 15000

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

ประเภทของเรคอร์ด PL/SQL

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

ประเภทบันทึก ประกาศด้วย โครงสร้างมาจาก
บันทึกตามตาราง ชื่อตาราง%ประเภทแถว คอลัมน์ทั้งหมดของตาราง
การบันทึกตามเคอร์เซอร์ ชื่อเคอร์เซอร์%ประเภทแถว รายการที่เลือกของเคอร์เซอร์
บันทึกที่กำหนดโดยโปรแกรมเมอร์ ประเภท … คือบันทึก คอลัมน์ที่คุณเขียนด้วยมือ

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

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

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

%ROWTYPE ใช้สำหรับประกาศเรคอร์ดที่มีฟิลด์ตรงกับตารางหรือเคอร์เซอร์โดยอัตโนมัติ ใช้เมื่อเรคอร์ดควรสะท้อนข้อมูลจากแหล่งข้อมูล เพื่อให้การเปลี่ยนแปลงคอลัมน์แสดงผลโดยไม่ต้องแก้ไขการประกาศ

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

ใช่แล้ว AI สามารถอ่านคำจำกัดความของตารางและสร้างบล็อก TYPE … IS RECORD ที่ตรงกัน หรือแนะนำ %ROWTYPE ในกรณีที่ต้องการลิงก์ไปยังตารางโดยตรง โปรดตรวจสอบประเภทข้อมูลก่อนใช้งาน

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

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