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

ما هو المؤشر في PL/SQL؟
المؤشر هو دليل يشير إلى منطقة السياق. Oracle يُنشئ مساحة سياق لمعالجة SQL البيان، وهذه المنطقة تحتوي على جميع المعلومات المتعلقة بالبيان.
PL / SQL يُمكّن هذا الأسلوب المبرمج من التحكم في منطقة السياق من خلال المؤشر. يحتوي المؤشر على الصفوف التي تُرجعها عبارة SQL، وتُسمى مجموعة الصفوف التي يحتويها المؤشر بالمجموعة النشطة. كما يمكن تسمية هذه المؤشرات بحيث يُمكن الرجوع إليها من أي مكان آخر في الكود.
يوجد نوعان من المؤشر:
- المؤشر الضمني
- مؤشر صريح
المؤشر الضمني
متى ما كان أي عملية DML عند حدوث تغيير في قاعدة البيانات، يتم إنشاء مؤشر ضمني يحتوي على الصفوف المتأثرة بتلك العملية. لا يمكن تسمية هذه المؤشرات، وبالتالي لا يمكن التحكم بها أو الرجوع إليها من أي مكان آخر في الكود. يمكننا الرجوع فقط إلى أحدث مؤشر من خلال خصائص المؤشر.
مؤشر صريح
يُسمح للمبرمجين بإنشاء منطقة سياق مُسماة لتنفيذ عمليات DML الخاصة بهم والحصول على مزيد من التحكم فيها. يجب تعريف المؤشر الصريح في قسم الإعلان الخاص بـ كتلة بل/SQLويتم إنشاؤه لعبارة SELECT التي يجب استخدامها في الكود.
فيما يلي الخطوات المتبعة في العمل مع المؤشرات الصريحة:
- تحديد المؤشر: يعني تعريف المؤشر ببساطة إنشاء منطقة سياق مُسماة لعبارة SELECT المُعرّفة في جزء التعريف. اسم منطقة السياق هذه هو نفسه اسم المؤشر.
- فتح المؤشر: يؤدي فتح المؤشر إلى توجيه لغة PL/SQL لتخصيص الذاكرة لهذا المؤشر، مما يجعله جاهزًا لجلب السجلات.
- جلب البيانات من المؤشر: في هذه العملية، يتم تنفيذ عبارة SELECT وتخزين الصفوف المُسترجعة في الذاكرة المُخصصة. تُسمى هذه الصفوف الآن بالمجموعات النشطة. يُعد استرجاع البيانات من المؤشر عملية على مستوى السجل، مما يعني أنه يُمكننا الوصول إلى البيانات سجلًا تلو الآخر. تسترجع كل عبارة fetch مجموعة نشطة واحدة وتحتفظ بمعلومات ذلك السجل المُحدد. تُشبه هذه العبارة عبارة SELECT التي تسترجع السجل وتُسنده إلى المتغير في عبارة INTO، ولكنها لن تُطلق أي استثناء. الاستثناءات.
- إغلاق المؤشر: بمجرد جلب جميع السجلات، نحتاج إلى إغلاق المؤشر حتى يتم تحرير الذاكرة المخصصة لمنطقة السياق هذه.
بناء الجملة
DECLARE CURSOR <cursor_name> IS <SELECT statement>; <cursor_variable declaration>; BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
في الصيغة المذكورة أعلاه، يتضمن جزء التصريح تعريف المؤشر ومتغير المؤشر الذي ستُخزَّن فيه البيانات المُسترجعة. يُنشأ المؤشر لعبارة SELECT المُحددة في تصريح المؤشر. في جزء التنفيذ، يُفتح المؤشر المُصرَّح عنه، وتُسترجع البيانات منه، ثم يُغلق.
سمات المؤشر
يحتوي كل من المؤشر الضمني والمؤشر الصريح على سمات معينة يمكن الوصول إليها. توفر هذه السمات معلومات إضافية حول عمليات المؤشر. فيما يلي سمات المؤشر المختلفة واستخداماتها.
| سمة المؤشر | الوصف |
|---|---|
| ٪وجدت | تُرجع هذه الدالة النتيجة المنطقية TRUE إذا نجحت عملية الجلب الأخيرة في جلب سجل؛ وإلا فإنها تُرجع FALSE. |
| ٪غير معثور عليه | يعمل عكس وظيفة %FOUND. فهو يُرجع القيمة TRUE إذا لم تتمكن عملية الجلب الأخيرة من جلب أي سجل. |
| ٪مفتوح | تُرجع الدالة القيمة المنطقية TRUE إذا كان المؤشر المحدد مفتوحًا بالفعل؛ وإلا فإنها تُرجع القيمة FALSE. |
| ٪ ROWCOUNT | تُرجع قيمة عددية تُعطي العدد الفعلي للسجلات المتأثرة أو التي تم جلبها بواسطة العملية. |
مثال صريح للمؤشر: في هذا المثال، سنتعرف على كيفية تعريف مؤشر صريح، وفتحه، وجلب البيانات منه، وإغلاقه. سنعرض جميع أسماء الموظفين من جدول الموظفين باستخدام مؤشر. كما سنستخدم خاصية المؤشر لضبط حلقة التكرار لجلب جميع السجلات منه.
تُظهر لقطة الشاشة أدناه مثال المؤشر الصريح هذا ومخرجاته في Oracle.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line('Employee Fetched:'||lv_emp_name); END LOOP; Dbms_output.put_line('Total rows fetched is'||guru99_det%ROWCOUNT); CLOSE guru99_det; END; /
الناتج
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code تفسير
- Code السطر 2: تعريف المؤشر guru99_det للعبارة 'SELECT emp_name FROM emp'.
- Code السطر 3: تعريف المتغير lv_emp_name باستخدام ٪نوع مرتبط بـ emp.emp_name.
- Code السطر 5: فتح المؤشر guru99_det.
- Code السطر 6: ضبط عبارة الحلقة الأساسية لجلب جميع السجلات في جدول الموظفين.
- Code السطر 7: يسترجع بيانات guru99_det ويسند القيمة إلى lv_emp_name.
- Code السطر 8: يُستخدم مُعامل المؤشر %NOTFOUND للتحقق مما إذا تم جلب جميع السجلات الموجودة في المؤشر. إذا تم جلبها، يُرجع البرنامج القيمة TRUE ويخرج من الحلقة؛ وإلا يستمر البرنامج في جلب البيانات من المؤشر وطباعتها.
- Code السطر 10: شرط الخروج لبيان الحلقة.
- Code السطر 12: طباعة اسم الموظف الذي تم جلبه.
- Code السطر 14: استخدام سمة المؤشر %ROWCOUNT للعثور على العدد الإجمالي للسجلات التي تم جلبها بواسطة المؤشر.
- Code السطر 15: بعد الخروج من الحلقة، يتم إغلاق المؤشر وتحرير الذاكرة المخصصة.
FOR بيان المؤشر الدائري
مؤشر لحلقة يمكن استخدام هذه الطريقة للتعامل مع المؤشرات. يمكننا تحديد اسم المؤشر بدلاً من تحديد نطاق في عبارة حلقة FOR، بحيث تعمل الحلقة من أول سجل في المؤشر إلى آخر سجل فيه. يتم إنشاء متغير المؤشر، وفتحه، وجلب البيانات منه، وإغلاقه ضمنيًا بواسطة حلقة FOR.
بناء الجملة
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
في الصيغة المذكورة أعلاه، يحتوي جزء التصريح على تعريف المؤشر. يُنشأ المؤشر لعبارة SELECT المحددة في تعريف المؤشر. في جزء التنفيذ، يُهيأ المؤشر المُصرّح عنه داخل حلقة FOR، ويتصرف متغير الحلقة 'I' كمتغير المؤشر في هذه الحالة.
Oracle مثال على استخدام المؤشر في حلقة التكرار: في هذا المثال، سنقوم بعرض جميع أسماء الموظفين من جدول الموظفين باستخدام حلقة المؤشر FOR.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line('Employee Fetched:'||lv_emp_name.emp_name); END LOOP; END; /
الناتج
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Code تفسير
- Code السطر 2: تعريف المؤشر guru99_det للعبارة 'SELECT emp_name FROM emp'.
- Code السطر 4: إنشاء حلقة FOR للمؤشر باستخدام متغير الحلقة lv_emp_name.
- Code السطر 6: طباعة اسم الموظف في كل تكرار للحلقة.
- Code السطر 7: الخروج من الحلقة (نهاية الحلقة).
ملاحظة: في حلقة المؤشر FOR، لا يمكن استخدام سمات المؤشر، لأن فتح المؤشر وجلب البيانات وإغلاقه يتم ضمنيًا بواسطة حلقة FOR.

