Oracle نوع سجلات PL/SQL مع الأمثلة
⚡ ملخص ذكي
نوع سجل 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 ); /
الإخراج:
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; /
الإخراج:
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.
- 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: ملء جدول الموظفين بالقيم التالية: 1002 كرقم الموظف، YYY كاسم الموظف، 15000 كراتب، و1000 كرقم المدير.
- Code السطر 12: تنفيذ معاملة الإدراج.
- Code السطر 13: تعبئة المتغير 'guru99_emp_rec' على مستوى الصف من استعلام التحديد للموظف رقم 1002.
- Code الأسطر 15-19: عرض قيمة 'guru99_emp_rec' في المخرجات.
الإخراج:
Employee Detail Employee Number: 1002 Employee Name: YYY Employee Salary: 1000 Employee Manager Number: 15000
ملاحظة: لا يمكن الوصول إلى نوع السجل إلا على مستوى العمود عند إعادة توجيه قيمته إلى أي نمط إخراج. لاحظ أن ترتيب قائمة SELECT في هذا المثال لا يتطابق مع ترتيب حقول السجل، ولهذا السبب تظهر قيمتا الراتب والمدير معكوسة في المخرجات.
أنواع سجلات PL/SQL
بالإضافة إلى السجل المحدد من قبل المبرمج والموضح أعلاه، Oracle يُوفر نوعين من السجلات المُثبتة التي تنسخ بنيتها تلقائيًا. يُجنّب استخدامها إعادة تعريف الأعمدة ويُحافظ على تزامن السجل مع الجدول أو المؤشر الذي يستند إليه.
| نوع السجل | أُعلن مع | يستمد الهيكل من |
|---|---|---|
| سجل قائم على الجدول | اسم_الجدول%نوع_الصف | جميع أعمدة الجدول |
| سجل قائم على المؤشر | اسم_المؤشر%نوع_الصف | قائمة اختيار المؤشر |
| سجل مُعرَّف من قِبل المبرمج | النوع … هو سجل | الأعمدة التي تقوم بإدراجها يدويًا |
يُعد سجل %ROWTYPE الخيار الأكثر أمانًا عندما يجب أن يتبع الشكل جدولًا أو المؤشر، لأن تغيير العمود يتم رصده تلقائيًا في عملية التجميع التالية.




