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

ประเภทบันทึกคืออะไร?
ประเภทเรคอร์ดเป็นประเภทข้อมูลที่ซับซ้อน ซึ่งช่วยให้นักโปรแกรมสามารถสร้างประเภทข้อมูลใหม่ที่มีโครงสร้างคอลัมน์ตามที่ต้องการได้ คุณลักษณะหลักของประเภทเรคอร์ดมีดังนี้:
- เป็นการรวมคอลัมน์ตั้งแต่หนึ่งคอลัมน์ขึ้นไปเพื่อสร้างชนิดข้อมูลใหม่
- แต่ละคอลัมน์เหล่านี้มีชื่อและชนิดข้อมูลเฉพาะของตนเอง
- ประเภทระเบียนสามารถรับข้อมูลได้ในรูปแบบระเบียนเดียวที่ประกอบด้วยหลายคอลัมน์ หรือสามารถรับค่าสำหรับคอลัมน์ใดคอลัมน์หนึ่งของระเบียนก็ได้
- ประเภทเรคอร์ดเป็นเพียงประเภทข้อมูลใหม่ เมื่อสร้างแล้ว จะถูกจัดเก็บเป็นประเภทข้อมูลใหม่และสามารถใช้เพื่อประกาศตัวแปรในโปรแกรมได้
- มันใช้คำหลัก 'พิมพ์' เพื่อแจ้งให้คอมไพเลอร์ทราบว่ากำลังสร้างชนิดข้อมูลใหม่
- สามารถสร้างได้ที่ ระดับฐานข้อมูลจัดเก็บเป็นอ็อบเจ็กต์ในฐานข้อมูลและใช้งานทั่วทั้งฐานข้อมูล หรือที่ระดับหนึ่ง ระดับโปรแกรมย่อยสามารถมองเห็นได้เฉพาะภายในโปรแกรมย่อยเท่านั้น
- นอกจากนี้ยังสามารถประกาศชนิดข้อมูลระดับฐานข้อมูลสำหรับคอลัมน์ของตารางได้ เพื่อให้คอลัมน์เดียวสามารถเก็บข้อมูลที่ซับซ้อนได้
- การเข้าถึงข้อมูลทำได้โดยการอ้างอิงชื่อตัวแปร ตามด้วยเครื่องหมายจุด (.) แล้วตามด้วยชื่อคอลัมน์ เช่น ' . '.
ไวยากรณ์สำหรับการประกาศประเภทเรคอร์ด
ไวยากรณ์สำหรับการประกาศในระดับฐานข้อมูล:
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 เป็นตัวเลือกที่ปลอดภัยที่สุดเมื่อรูปร่างควรเป็นไปตามตารางหรือ เคอร์เซอร์เนื่องจากการเปลี่ยนแปลงคอลัมน์จะถูกตรวจจับโดยอัตโนมัติในการคอมไพล์ครั้งถัดไป




