Oracle نوع سجلات PL/SQL مع الأمثلة

⚡ ملخص ذكي

نوع سجل PL/SQL هو نوع بيانات معقد يجمع عدة أعمدة، لكل منها اسم ونوع بيانات خاص بها، في نوع واحد جديد. يمكن تعريف السجل على مستوى قاعدة البيانات ككائن مخزن أو داخل برنامج فرعي، ويتم الوصول إلى حقوله باستخدام عامل النقطة.

  • 🧱 فريف: يقوم نوع السجل بتجميع عمود واحد أو أكثر في نوع بيانات جديد واحد.
  • 🔑 عدد القطع تُخبر الكلمة المفتاحية TYPE المُترجم بأنه يتم إنشاء نوع بيانات جديد.
  • 🏛️ مستويين: السجل على مستوى قاعدة البيانات هو كائن مخزن؛ أما السجل على مستوى البرنامج الفرعي فهو مرئي فقط داخل ذلك البرنامج الفرعي.
  • 🔗 الوصول الميداني: يتم الوصول إلى الحقول باستخدام اسم العمود (column_name) كـ 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
);
/

الإخراج:

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 الخيار الأكثر أمانًا عندما يجب أن يتبع الشكل جدولًا أو المؤشر، لأن تغيير العمود يتم رصده تلقائيًا في عملية التجميع التالية.

الأسئلة الشائعة

يُجمّع السجل أعمدةً مختلفةً، قد تكون من أنواعٍ مختلفة، في بنيةٍ تُشبه الصف. أما المجموعة، فتضمّ عناصرَ عديدةً من النوع نفسه، مُفهرسةً برمزٍ سفلي. وغالبًا ما تُدمج هذه العناصر لتُشكّل مجموعةً من السجلات.

يُعرّف %ROWTYPE سجلاً تتطابق حقوله مع جدول أو مؤشر تلقائيًا. استخدمه عندما يُراد للسجل أن يعكس المصدر، بحيث ينعكس تغيير العمود دون تعديل التعريف.

نعم، إذا كان كلا السجلين من نفس النوع. يمكن لعبارة SELECT INTO أيضًا ملء سجل كامل من صف جدول، بشرط أن يتطابق ترتيب قائمة التحديد مع ترتيب حقول السجل.

نعم. يمكن للذكاء الاصطناعي قراءة تعريف الجدول وإنشاء كتلة مطابقة من نوع ... IS RECORD، أو التوصية بنوع صف %ROWTYPE حيث يُفضّل وجود رابط مباشر للجدول. تحقق من أنواع البيانات قبل الاستخدام.

يُنشأ سجل على مستوى قاعدة البيانات باستخدام الأمر CREATE TYPE ويُخزن ككائن مرئي في جميع أنحاء قاعدة البيانات. أما سجل على مستوى البرنامج الفرعي فيُعلن عنه داخل كتلة برمجية ولا يوجد إلا داخل ذلك البرنامج الفرعي.

تلخيص هذه التدوينة بـ: