Oracle مجموعات PL/SQL: Varrays، المتداخلة والفهرسة حسب الجداول
⚡ ملخص ذكي
مجموعات PL/SQL هي مجموعات مرتبة من عناصر من نفس نوع البيانات، ويتم الوصول إلى كل منها بواسطة فهرس. هناك ثلاثة أنواع، هي Varray والجدول المتداخل والجدول المفهرس، وتختلف فيما إذا كان حجمها ثابتًا، وكيفية عمل الفهرس، وما إذا كان يمكن تخزينها في قاعدة البيانات.

ما هي المجموعة؟
المجموعة هي مجموعة مرتبة من عناصر من نوع بيانات معين. يمكن أن تكون مجموعة من نوع بيانات بسيط أو نوع بيانات معقد مثل أنواع البيانات المعرفة من قبل المستخدم أو أنواع السجلات.
في المجموعة، يتم تحديد كل عنصر بواسطة مصطلح يسمى "مخطوطة." يتم تخصيص رمز فرعي فريد لكل عنصر، ويمكن معالجة البيانات أو جلبها بالرجوع إلى هذا الرمز الفرعي الفريد.
تُعدّ المجموعات مفيدة للغاية عند الحاجة إلى معالجة أو تعديل كمية كبيرة من البيانات من النوع نفسه. ويمكن ملء المجموعات ومعالجتها ككل باستخدام خيار "BULK" في Oracle.
يتم تصنيف المجموعات بناءً على بنيتها وفهرسها وتخزينها، كما هو موضح أدناه:
- الجداول المفهرسة (المعروفة أيضًا باسم المصفوفات الترابطية)
- الجداول المتداخلة
- فارايز
في أي وقت، يمكن الإشارة إلى البيانات في مجموعة ما بثلاثة مصطلحات: اسم المجموعة، والرمز السفلي، واسم الحقل أو العمود، على النحو التالي: " ( ). ستتعرف على فئات المجموعات هذه في الأقسام أدناه.
أنواع المجموعات في لمحة
تُقدّم أنواع المجموعات الثلاثة مزايا وعيوباً مختلفة. يعرض الجدول أدناه مقارنة بينها قبل شرح كل منها بالتفصيل.
| البعد | فاراي | طاولة متداخلة | جدول الفهرسة |
|---|---|---|---|
| المقاس | حد أعلى ثابت | لا حدود | لا حدود |
| منخفض | رقمية | رقمية | عدد صحيح أو سلسلة نصية |
| كثافة | كثيف دائماً | كثيف أو متفرق | دائماً متفرق |
| مخزنة في قاعدة البيانات | نعم | نعم | لا |
| يحتاج إلى تهيئة | نعم | نعم | لا |
فارايز
المصفوفة المتغيرة (Varray) هي مجموعة بيانات يكون حجمها ثابتًا ولا يمكن تجاوزه. يمثل فهرس المصفوفة المتغيرة قيمة عددية. خصائص المصفوفات المتغيرة هي:
- الحد الأقصى للحجم ثابت.
- يتم ملؤها بالتسلسل بدءًا من الرقم السفلي '1'.
- هذا النوع من المجموعات كثيف دائمًا؛ لا يمكننا حذف عناصر المصفوفة بشكل فردي. يمكن حذف المصفوفة المتغيرة (Varray) بالكامل أو اقتطاع جزء منها من النهاية.
- ولأنها كثيفة دائماً، فإن مرونتها ضئيلة للغاية.
- يكون ذلك أكثر ملاءمة عندما يكون حجم المصفوفة معروفًا ويتم تنفيذ أنشطة مماثلة على جميع العناصر.
- يظل الرقم السفلي وعدد عناصر المجموعة ثابتين دائمًا.
- يجب تهيئتها قبل الاستخدام. أي عملية باستثناء EXISTS على مجموعة غير مهيأة ستؤدي إلى ظهور خطأ.
- يمكن إنشاؤه ككائن قاعدة بيانات مرئي في جميع أنحاء قاعدة البيانات، أو داخل برنامج فرعي لاستخدامه هناك فقط.
يوضح الشكل أدناه تخصيص الذاكرة لمصفوفة متغيرة (كثيفة).
| منخفض | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| بعد التخفيض | XYZ | دفف | سدي | Cxs | في بي سي | نهو | QWE |
بناء جملة VARRAY:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- في الصيغة المذكورة أعلاه، تم تعريف type_name كمصفوفة متغيرة من النوع 'DATA_TYPE' ضمن حد الحجم المحدد. يمكن أن يكون نوع البيانات بسيطًا أو معقدًا.
الجداول المتداخلة
الجدول المتداخل هو مجموعة بيانات لا يكون حجم عناصرها ثابتًا. وهو من نوع الفهرسة الرقمية. المزيد حول نوع الجدول المتداخل:
- لا يوجد حد أقصى لحجم الجدول المتداخل.
- لأن الحد الأعلى غير ثابت، يجب توسيع الذاكرة في كل مرة قبل الاستخدام، باستخدام الكلمة المفتاحية 'EXTEND'.
- يتم ملؤها بالتسلسل بدءًا من الرقم السفلي '1'.
- يمكن أن يكون هذا النوع من المجموعات كلاهما كثيفة ومتفرقةيمكننا إنشاءها بشكل كثيف، وكذلك حذف العناصر الفردية بشكل عشوائي، مما يجعلها متفرقة.
- فهو يوفر مرونة أكبر لحذف عناصر المصفوفة.
- يتم تخزينها في جدول قاعدة بيانات تم إنشاؤه بواسطة النظام ويمكن استخدامها في استعلام تحديد لجلب القيم.
- قد يختلف الرقم السفلي وعدد الأرقام.
- يجب تهيئتها قبل الاستخدام. أي عملية باستثناء EXISTS على مجموعة غير مهيأة ستؤدي إلى ظهور خطأ.
- يمكن إنشاؤه ككائن قاعدة بيانات مرئي في جميع أنحاء قاعدة البيانات، أو داخل برنامج فرعي لاستخدامه هناك فقط.
يوضح الشكل أدناه كيفية تخصيص الذاكرة لجدول متداخل (كثيف ومتفرق). تشير مساحة العنصر الفارغة إلى عنصر متفرق.
| منخفض | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| القيمة (كثيفة) | XYZ | دفف | سدي | Cxs | في بي سي | نهو | QWE |
| القيمة (المتفرقة) | QWE | ASD | اف جي | ASD | ور |
بناء جملة الجدول المتداخل:
TYPE <type_name> IS TABLE OF <DATA_TYPE>;
- في الصيغة المذكورة أعلاه، تم تعريف type_name على أنه مجموعة جداول متداخلة من النوع 'DATA_TYPE'. يمكن أن يكون نوع البيانات بسيطًا أو معقدًا.
جدول الفهرسة
الجدول المفهرس هو مجموعة بيانات لا يكون حجم مصفوفتها ثابتًا. على عكس أنواع المجموعات الأخرى، يمكن للمستخدم تحديد فهرس الجدول المفهرس. خصائص الجدول المفهرس هي:
- يمكن أن يكون الفهرس عددًا صحيحًا أو سلسلة نصية. يجب تحديد نوع الفهرس عند إنشاء المجموعة.
- لا يتم تخزين هذه المجموعات بشكل تسلسلي.
- فهي دائما متفرقة في الطبيعة.
- حجم المصفوفة غير ثابت.
- لا يمكن تخزينها في عمود قاعدة البيانات. يتم إنشاؤها واستخدامها ضمن جلسة معينة.
- فهي توفر مرونة أكبر في الحفاظ على الخط السفلي.
- يمكن أن تكون الأرقام السفلية سلسلة سالبة.
- وهي أكثر ملاءمة لقيم التجميع الأصغر نسبياً المستخدمة ضمن نفس البرنامج الفرعي.
- لا يلزم تهيئتها قبل الاستخدام.
- لا يمكن إنشاؤها ككائن قاعدة بيانات؛ يتم إنشاؤها فقط داخل برنامج فرعي.
- لا يمكن استخدام BULK COLLECT مع هذا النوع من المجموعات، لأنه يجب إعطاء الفهرس الفرعي بشكل صريح لكل سجل.
يوضح الشكل أدناه كيفية تخصيص الذاكرة لجدول مفهرس (متفرق). تشير مساحة العنصر الفارغة إلى عنصر متفرق.
| منخفض (فارشار) | الأول | الثاني | الثالث | الرابع | الخامس | السادس | السابع |
| القيمة (المتفرقة) | QWE | ASD | اف جي | ASD | ور |
صيغة فهرسة الجدول:
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- في الصيغة المذكورة أعلاه، تم تعريف type_name كمجموعة جداول مفهرسة من النوع 'DATA_TYPE'. وتم تحديد متغير الفهرسة كنوع VARCHAR2 بحجم أقصى 10.
مفهوم المنشئ والتهيئة في المجموعات
الدوال البانية هي دوال مدمجة يوفرها Oracle التي تحمل نفس اسم الكائن أو المجموعة. تُنفَّذ هذه الدوال أولًا عند الإشارة إلى كائن أو مجموعة لأول مرة في الجلسة. تفاصيل مهمة حول دالة البناء في سياق المجموعة:
- بالنسبة للمجموعات، يجب استدعاء هذه الدوال البانية بشكل صريح لتهيئة المجموعة.
- يجب تهيئة كل من المصفوفة المتغيرة والجداول المتداخلة من خلال هذه المنشئات قبل الإشارة إليها في البرنامج.
- يقوم المُنشئ ضمنيًا بتوسيع تخصيص الذاكرة لمجموعة (باستثناء Varray)، لذلك يمكنه أيضًا تعيين متغيرات للمجموعة.
- لا يؤدي تعيين القيم من خلال الدوال البانية إلى جعل المجموعة متفرقة.
طرق الجمع
Oracle توفر هذه المكتبة العديد من الوظائف لمعالجة المجموعات والتعامل معها. وتحدد هذه الوظائف سمات المجموعة المختلفة وتعدلها. يوضح الجدول أدناه الوظائف المختلفة ووصفها.
| الأسلوب | الوصف | بناء الجملة |
|---|---|---|
| موجود (ن) | تُرجع هذه الدالة قيمة منطقية (Boolean). تُرجع القيمة TRUE إذا كان العنصر رقم n موجودًا، وإلا تُرجع القيمة FALSE. لا يُمكن استخدام سوى الدالة EXISTS مع مجموعة غير مُهيأة. | .موجود(element_position) |
| بالإحصاء | يعطي العدد الإجمالي للعناصر الموجودة في المجموعة. | .عدد |
| مما سيحدث | تُعيد هذه الدالة الحد الأقصى لحجم المجموعة. بالنسبة للمصفوفات المتغيرة (Varray)، تُعيد حجمًا ثابتًا؛ أما بالنسبة للجداول المتداخلة والجداول المفهرسة، فتُعيد قيمة فارغة (NULL). | .حد |
| الأول | يُعيد قيمة أول عنصر فرعي في المجموعة. | .أولاً |
| آخر | يُعيد قيمة آخر عنصر فرعي في المجموعة. | .آخر |
| قبل (ن) | تُعيد هذه الدالة الفهرس السابق للعنصر رقم n. إذا لم يكن هناك فهرس سابق، تُعيد الدالة قيمة NULL. | .قبل (ن) |
| التالي (ن) | يُعيد هذا التابع الفهرس التالي للعنصر رقم n. إذا لم يكن هناك فهرس، فسيتم إرجاع قيمة NULL. | .التالي(ن) |
| تمديد | يُضيف عنصرًا واحدًا في نهاية المجموعة. | .يمتد |
| تمديد (ن) | يمتد عدد n من العناصر في نهاية المجموعة. | .تمديد(ن) |
| تمديد (ن،ط) | يقوم بتمديد عدد n من نسخ العنصر رقم i في نهاية المجموعة. | تمديد (ن،ط) |
| TRIM | يزيل عنصرًا واحدًا من نهاية المجموعة. | .تقليم |
| تقليم (ن) | يزيل n عنصرًا من نهاية المجموعة. | .تريم (ن) |
| حذف | يحذف جميع العناصر من المجموعة، مما يجعلها فارغة. | .يمسح |
| حذف (ن) | يحذف العنصر رقم n. إذا كان العنصر رقم n يساوي NULL، فلا يفعل شيئًا. | .حذف(ن) |
| حذف (م،ن) | يحذف العناصر الموجودة في النطاق من mth إلى nth في المجموعة. | .حذف(م،ن) |
مثال 1: نوع السجل على مستوى البرنامج الفرعي
في هذا المثال، سنرى كيفية ملء المجموعة باستخدام 'جمع بالجملةوكيفية الإشارة إلى بيانات المجموعة.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl(); BEGIN INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,'AAA',25000,1000); INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX',10000,1000); INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,'ZZZ',7500,1000); COMMIT; SELECT emp_no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec FROM emp; dbms_output.put_line ('Employee Detail'); FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST LOOP dbms_output.put_line ('Employee Number: '||guru99_emp_rec(i).emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec(i).emp_name); dbms_output.put_line ('Employee Salary:'|| guru99_emp_rec(i).salary); dbms_output.put_line('Employee Manager Number:'||guru99_emp_rec(i).manager); dbms_output.put_line('--------------------------------'); END LOOP; END; /
Code تفسير
- Code الأسطر 2-8: نوع السجل تم تعريف 'emp_det' بأعمدة emp_no و emp_name و manager و salary من نوع البيانات NUMBER و VARCHAR2 و NUMBER و NUMBER.
- Code السطر 9: إنشاء المجموعة 'emp_det_tbl' من نوع السجل العنصر 'emp_det'.
- Code السطر 10: تعريف المتغير 'guru99_emp_rec' كنوع 'emp_det_tbl' وتهيئته باستخدام مُنشئ فارغ.
- Code الأسطر 12-15: إدراج بيانات العينة في جدول "emp".
- Code السطر 16: تنفيذ معاملة الإدراج.
- Code السطر 17: يتم جلب السجلات من جدول 'emp' وتعبئة متغير المجموعة دفعة واحدة باستخدام "BULK COLLECT". يحتوي المتغير 'guru99_emp_rec' الآن على جميع السجلات الموجودة في جدول 'emp'.
- Code الأسطر 19-26: ضبط حلقة "FOR" لطباعة جميع السجلات في المجموعة واحدًا تلو الآخر. تُستخدم طريقتي التجميع FIRST و LAST كحدين أدنى وأعلى لـ حلقة.
الإخراج: عند تنفيذ الكود أعلاه، ستحصل على المخرجات التالية.
Employee Detail Employee Number: 1000 Employee Name: AAA Employee Salary: 25000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1002 Employee Name: YYY Employee Salary: 15000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1003 Employee Name: ZZZ Employee Salary: 7500 Employee Manager Number: 1000 ----------------------------------------------

