Oracle مجموعات PL/SQL: Varrays، المتداخلة والفهرسة حسب الجداول
ما هو التحصيل؟
المجموعة عبارة عن مجموعة مرتبة من عناصر أنواع بيانات معينة. يمكن أن تكون مجموعة من نوع بيانات بسيط أو نوع بيانات معقد (مثل أنواع البيانات المحددة من قبل المستخدم أو أنواع السجلات).
في المجموعة، يتم تحديد كل عنصر بمصطلح يسمى "مخطوطة." يتم تعيين كل عنصر في المجموعة برمز منخفض فريد. يمكن معالجة البيانات الموجودة في تلك المجموعة أو جلبها من خلال الإشارة إلى هذا الحرف المنخفض الفريد.
تعد المجموعات أكثر الأشياء فائدة عندما يلزم معالجة أو معالجة بيانات كبيرة من نفس النوع. يمكن ملء المجموعات ومعالجتها بالكامل باستخدام خيار "BULK" في Oracle.
يتم تصنيف المجموعات بناءً على البنية والخط السفلي والتخزين كما هو موضح أدناه.
- فهرس حسب الجداول (المعروف أيضًا باسم الصفيف النقابي)
- الجداول المتداخلة
- فارايز
في أي وقت، يمكن الإشارة إلى البيانات الموجودة في المجموعة من خلال ثلاثة مصطلحات: اسم المجموعة، الحرف المنخفض، اسم الحقل/العمود باسم " ( ). ". سوف تتعرف على فئات المجموعة المذكورة أعلاه بشكل أكبر في القسم أدناه.
فارايز
Varray هي طريقة تجميع يكون فيها حجم المصفوفة ثابتًا. لا يمكن أن يتجاوز حجم المصفوفة قيمته الثابتة. يكون الرمز السفلي لـ Varray عبارة عن قيمة عددية. فيما يلي سمات Varrays.
- حجم الحد الأعلى ثابت
- يتم ملؤها بشكل تسلسلي بدءًا من الحرف "1"
- هذا النوع من المجموعة يكون دائمًا كثيفًا، أي لا يمكننا حذف أي عناصر من المصفوفة. يمكن حذف Varray ككل، أو يمكن قطعه من النهاية.
- نظرًا لأنها كثيفة بطبيعتها دائمًا، فهي تتمتع بمرونة أقل جدًا.
- من الأفضل استخدامه عندما يكون حجم المصفوفة معروفًا ولأداء أنشطة مماثلة على جميع عناصر المصفوفة.
- يظل الخط المنخفض والتسلسل ثابتين دائمًا، أي أن الخط المنخفض وعدد المجموعة يكونان دائمًا متماثلين.
- يجب تهيئتها قبل استخدامها في البرامج. ستؤدي أي عملية (باستثناء عملية EXISTS) على مجموعة غير مهيأة إلى حدوث خطأ.
- يمكن إنشاؤه ككائن قاعدة بيانات، والذي يكون مرئيًا عبر قاعدة البيانات أو داخل البرنامج الفرعي، والذي يمكن استخدامه فقط في هذا البرنامج الفرعي.
يوضح الشكل أدناه تخصيص ذاكرة Varray (الكثيفة) بشكل تخطيطي.
| منخفض | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| بعد التخفيض | XYZ | دفف | سدي | Cxs | في بي سي | نهو | QWE |
بناء جملة VARRAY:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- في بناء الجملة أعلاه، يتم إعلان type_name كـ VARRAY من النوع 'DATA_TYPE' لحد الحجم المحدد. يمكن أن يكون نوع البيانات إما بسيطًا أو معقدًا.
الجداول المتداخلة
الجدول المتداخل عبارة عن مجموعة لا يكون حجم المصفوفة فيها ثابتًا. لديه نوع منخفض رقمي. فيما يلي المزيد من الأوصاف حول نوع الجدول المتداخل.
- لا يحتوي الجدول المتداخل على حد أعلى للحجم.
- نظرًا لأن الحد الأعلى للحجم غير ثابت، فيجب توسيع ذاكرة المجموعة في كل مرة قبل استخدامها. يمكننا توسيع المجموعة باستخدام الكلمة الرئيسية "تمديد".
- يتم ملؤها بشكل تسلسلي بدءًا من الحرف "1".
- يمكن أن يكون نوع المجموعة هذا من الاثنين معًا كثيفة ومتفرقة، أي يمكننا إنشاء المجموعة كمجموعة كثيفة، ويمكننا أيضًا حذف عنصر المصفوفة الفردية بشكل عشوائي، مما يجعلها متفرقة.
- يوفر مرونة أكبر فيما يتعلق بحذف عنصر المصفوفة.
- يتم تخزينه في جدول قاعدة البيانات الذي أنشأه النظام ويمكن استخدامه في استعلام التحديد لجلب القيم.
- الحرف المنخفض والتسلسل غير مستقرين، أي يمكن أن يختلف الحرف المنخفض وعدد عناصر المصفوفة.
- يجب تهيئتها قبل استخدامها في البرامج. ستؤدي أي عملية (باستثناء عملية EXISTS) على المجموعة غير المهيأة إلى حدوث خطأ.
- يمكن إنشاؤه ككائن قاعدة بيانات، والذي يكون مرئيًا عبر قاعدة البيانات أو داخل البرنامج الفرعي، والذي يمكن استخدامه فقط في هذا البرنامج الفرعي.
يوضح الشكل أدناه تخصيص الذاكرة للجدول المتداخل (كثيفًا ومتفرقًا) بشكل تخطيطي. تشير مساحة العنصر ذات اللون الأسود إلى العنصر الفارغ في المجموعة، أي المتناثر.
| منخفض | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| القيمة (كثيفة) | XYZ | دفف | سدي | Cxs | في بي سي | نهو | QWE |
| القيمة (متفرقة) | QWE | ASD | اف جي | ASD | ور |
بناء جملة الجدول المتداخل:
TYPE <tvpe 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'. يمكن أن يكون نوع البيانات إما من النوع البسيط أو المعقد. يتم إعطاء متغير subsciprt/index كنوع VARCHAR2 مع الحد الأقصى للحجم 10.
مفهوم المنشئ والتهيئة في المجموعات
المنشئون هم الوظائف المضمنة التي يوفرها أوراكل والتي تحمل نفس اسم الكائن أو المجموعات. يتم تنفيذها أولاً كلما تمت الإشارة إلى الكائن أو المجموعات لأول مرة في جلسة. فيما يلي التفاصيل المهمة للمنشئ في سياق المجموعة:
- بالنسبة للمجموعات، يجب استدعاء هذه المنشئات بشكل صريح لتهيئتها.
- يجب تهيئة كل من جدولي Varray وNested من خلال هذه المُنشئات قبل إحالتهما إلى البرنامج.
- يقوم المُنشئ ضمنيًا بتوسيع تخصيص الذاكرة لمجموعة (باستثناء Varray)، وبالتالي يمكن للمنشئ أيضًا تعيين المتغيرات للمجموعات.
- لن يؤدي تعيين القيم إلى المجموعة من خلال المُنشئين إلى جعل المجموعة متفرقة أبدًا.
طرق الجمع
Oracle يوفر العديد من الوظائف للتعامل مع المجموعات والعمل عليها. هذه الوظائف مفيدة جدًا في البرنامج لتحديد وتعديل السمات المختلفة للمجموعات. سيوضح الجدول التالي الوظائف المختلفة ووصفها.
| الأسلوب | الوصف | بناء الجملة |
|---|---|---|
| موجود (ن) | ستعيد هذه الطريقة نتائج منطقية. سيتم إرجاع "TRUE" إذا كان nth العنصر موجود في تلك المجموعة، وإلا فسوف يُرجع FALSE. يمكن استخدام وظائف EXISTS فقط في المجموعة غير المهيأة | .موجود(element_position) |
| بالإحصاء | يعطي العدد الإجمالي للعناصر الموجودة في المجموعة | .عدد |
| مما سيحدث | تقوم بإرجاع الحد الأقصى لحجم المجموعة. بالنسبة إلى Varray، سيُرجع الحجم الثابت الذي تم تعريفه. بالنسبة للجدول المتداخل والفهرس حسب الجدول، فإنه يعطي NULL | .حد |
| الأول | تُرجع قيمة متغير الفهرس الأول (منخفض) للمجموعات | .أولاً |
| آخر | تُرجع قيمة متغير الفهرس الأخير (منخفض) للمجموعات | .آخر |
| قبل (ن) | تسبق الإرجاعات متغير الفهرس في مجموعة من nth عنصر. إذا لم يكن هناك قيمة فهرس تسبق يتم إرجاع NULL | .قبل (ن) |
| التالي (ن) | تنجح إرجاع متغير الفهرس في مجموعة nth عنصر. إذا لم يكن هناك نجاح يتم إرجاع قيمة الفهرس NULL | .التالي(ن) |
| تمديد | يمتد عنصر واحد في المجموعة في النهاية | .يمتد |
| تمديد (ن) | يمتد عناصر n في نهاية المجموعة | .تمديد(ن) |
| تمديد (ن،ط) | يمتد n نسخ من ith العنصر في نهاية المجموعة | تمديد (ن،ط) |
| TRIM | إزالة عنصر واحد من نهاية المجموعة | .تقليم |
| تقليم (ن) | يزيل عناصر n من نهاية المجموعة | .تريم (ن) |
| حذف | يحذف كافة العناصر من المجموعة. يجعل المجموعة فارغة | .يمسح |
| حذف (ن) | يحذف العنصر n من المجموعة. اذا ثمth العنصر NULL، فهذا لن يفعل شيئًا | .حذف(ن) |
| حذف (م،ن) | يحذف العنصر الموجود في النطاق mth إلى نth في المجموعة | .حذف(م،ن) |
مثال 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;
/
شرح الكود:
- سطر الكود 2-8: نوع السجل يتم الإعلان عن "emp_det" باستخدام الأعمدة emp_no وemp_name والراتب والمدير من نوع البيانات NUMBER وVARCHAR2 وNUMBER وNUMBER.
- سطر الكود 9: إنشاء المجموعة "emp_det_tbl" لعنصر نوع السجل "emp_det"
- سطر الكود 10: الإعلان عن المتغير "guru99_emp_rec" كنوع "emp_det_tbl" وتهيئته باستخدام مُنشئ فارغ.
- سطر الكود 12-15: إدراج بيانات العينة في جدول "emp".
- سطر الكود 16: تنفيذ معاملة الإدراج.
- سطر الكود 17: جلب السجلات من جدول 'emp' وملء متغير المجموعة كمجمّع باستخدام الأمر "BULK COLLECT". الآن يحتوي المتغير 'guru99_emp_rec' على كافة السجلات الموجودة في الجدول 'emp'.
- سطر الكود 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 ----------------------------------------------

