Oracle مجموعات PL/SQL: Varrays، المتداخلة والفهرسة حسب الجداول

⚡ ملخص ذكي

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

  • 🧺 فريف: تحتوي المجموعة على العديد من العناصر من نوع واحد، ويتم تحديد كل عنصر بواسطة رمز فرعي فريد.
  • 📐 مصفوفة: حجم علوي ثابت، كثيف دائمًا، فهرس رقمي سفلي، يجب تهيئته قبل الاستخدام.
  • 📚 جدول متداخل: لا يوجد حد للحجم، ويمكن أن يكون كثيفًا أو متفرقًا، ويتم تخزينه في جدول النظام، ويمكن توسيعه باستخدام EXTEND.
  • 🔑 فهرسة حسب الجدول: لا يوجد حد للحجم، ويمكن أن يكون الرمز السفلي سلسلة نصية أو عددًا صحيحًا سالبًا، ولا يتم تخزينه في قاعدة البيانات.
  • ؟؟؟؟ ️ البناء: تحتاج المصفوفات المتغيرة والجداول المتداخلة إلى مُنشئ صريح للتهيئة قبل الإشارة إليها.
  • 🛠️ الأساليب: تُدير الدوال COUNT وEXISTS وFIRST وLAST وEXTEND وTRIM وDELETE مجموعة بيانات.
  • ⚡ حجم: تتيح خاصية التجميع المجمع ملء مجموعة في خطوة واحدة لمعالجة سريعة.

Oracle مجموعات بل/SQL

ما هي المجموعة؟

المجموعة هي مجموعة مرتبة من عناصر من نوع بيانات معين. يمكن أن تكون مجموعة من نوع بيانات بسيط أو نوع بيانات معقد مثل أنواع البيانات المعرفة من قبل المستخدم أو أنواع السجلات.

في المجموعة، يتم تحديد كل عنصر بواسطة مصطلح يسمى "مخطوطة." يتم تخصيص رمز فرعي فريد لكل عنصر، ويمكن معالجة البيانات أو جلبها بالرجوع إلى هذا الرمز الفرعي الفريد.

تُعدّ المجموعات مفيدة للغاية عند الحاجة إلى معالجة أو تعديل كمية كبيرة من البيانات من النوع نفسه. ويمكن ملء المجموعات ومعالجتها ككل باستخدام خيار "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: نوع السجل على مستوى البرنامج الفرعي

في هذا المثال، سنرى كيفية ملء المجموعة باستخدام 'جمع بالجملةوكيفية الإشارة إلى بيانات المجموعة.

مثال على مجموعة PL/SQL تم ملؤها باستخدام BULK COLLECT

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
----------------------------------------------

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

تتميز المصفوفة المتغيرة (Varray) بحجم أقصى ثابت، وهي دائمًا كثيفة. أما الجدول المتداخل، فلا يوجد له حد أقصى للحجم، ويمكن أن يكون متفرقًا، ويمكن توسيعه، مما يجعله أكثر مرونة للتعامل مع البيانات المتزايدة أو المتقطعة.

لأنها مصفوفة ترابطية في الذاكرة، وليست جدولاً مخزناً. يعمل الفهرس السفلي كمفتاح بحث، لذا فإن السلسلة النصية أو العدد الصحيح السالب يعمل، وهو أمر مفيد لعمليات البحث باستخدام المفاتيح داخل الجلسة.

المصفوفة غير المهيأة أو الجدول المتداخل تكون فارغة بشكل تلقائي، لذا فإن الإشارة إلى عنصر فيها تُسبب خطأً. استدعاء الدالة البانية يُخصص لها مساحة، وبعد ذلك يمكن إضافة البيانات باستخدام الدالتين EXTEND و assigns.

نعم. بالنظر إلى ما إذا كان الحجم ثابتًا، وما إذا كانت البيانات مخزنة، وما إذا كان هناك حاجة إلى مفتاح سلسلة نصية، يمكن للذكاء الاصطناعي أن يشير إلى مصفوفة متغيرة، أو جدول متداخل، أو جدول مفهرس، وأن يشرح المفاضلة.

تقوم عملية BULK COLLECT بتحميل جميع الصفوف في مجموعة واحدة في تبديل سياق واحد بين محركي SQL و PL/SQL، بدلاً من تبديل واحد لكل صف، مما يقلل بشكل كبير من الحمل الزائد على مجموعات النتائج الكبيرة.

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