Oracle مؤشر PL/SQL: ضمني، صريح، للحلقة مع المثال
ما هو المؤشر في PL/SQL؟
المؤشر هو مؤشر إلى منطقة السياق هذه. Oracle ينشئ منطقة سياق لمعالجة عبارة SQL التي تحتوي على كافة المعلومات حول العبارة.
يسمح PL/SQL للمبرمج بالتحكم في منطقة السياق من خلال المؤشر. يحمل المؤشر الصفوف التي تم إرجاعها بواسطة عبارة SQL. تتم الإشارة إلى مجموعة الصفوف التي يحملها المؤشر على أنها مجموعة نشطة. يمكن أيضًا تسمية هذه المؤشرات بحيث يمكن الرجوع إليها من مكان آخر من الكود.
المؤشر هو من نوعين.
- المؤشر الضمني
- مؤشر صريح
المؤشر الضمني
كلما حدثت أي عمليات DML في قاعدة البيانات، يتم إنشاء مؤشر ضمني يحمل الصفوف المتأثرة، في تلك العملية المعينة. لا يمكن تسمية هذه المؤشرات، وبالتالي لا يمكن التحكم فيها أو الرجوع إليها من مكان آخر في الكود. يمكننا الإشارة فقط إلى المؤشر الأحدث من خلال سمات المؤشر.
مؤشر صريح
يُسمح للمبرمجين بإنشاء منطقة سياق مسماة لتنفيذ عمليات DML الخاصة بهم للحصول على مزيد من التحكم فيها. يجب تعريف المؤشر الصريح في قسم الإعلان في كتلة بل/SQL، ويتم إنشاؤه لعبارة "SELECT" التي يجب استخدامها في الكود.
فيما يلي الخطوات المتضمنة في العمل مع المؤشرات الصريحة.
- الإعلان عن المؤشر إن الإعلان عن المؤشر يعني ببساطة إنشاء منطقة سياق مسماة واحدة لعبارة "SELECT" التي تم تعريفها في جزء الإعلان. اسم منطقة السياق هذه هو نفس اسم المؤشر.
- فتح المؤشرسيؤدي فتح المؤشر إلى إرشاد PL / SQL لتخصيص الذاكرة لهذا المؤشر. سيجعل المؤشر جاهزًا لجلب السجلات.
- جلب البيانات من المؤشرفي هذه العملية، يتم تنفيذ عبارة "SELECT" ويتم تخزين الصفوف التي تم جلبها في الذاكرة المخصصة. وتسمى هذه الآن بالمجموعات النشطة. يعد جلب البيانات من المؤشر نشاطًا على مستوى السجل مما يعني أنه يمكننا الوصول إلى البيانات بطريقة كل سجل على حدة. ستجلب كل عبارة جلب مجموعة نشطة واحدة وتحتفظ بمعلومات هذا السجل المعين. هذه العبارة هي نفس عبارة "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 | تقوم بإرجاع القيمة العددية. إنه يعطي العدد الفعلي للسجلات التي تأثرت بنشاط DML. |
مثال صريح للمؤشر:
في هذا المثال، سنرى كيفية الإعلان عن المؤشر الصريح وفتحه وجلبه وإغلاقه.
سنقوم بعرض اسم الموظف بالكامل من جدول emp باستخدام المؤشر. سنستخدم أيضًا سمة المؤشر لتعيين الحلقة لجلب كل السجل من المؤشر.
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%R0WCOUNT); CLOSE guru99_det; END: /
الناتج
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
شرح الكود
- سطر الكود 2: الإعلان عن المؤشر guru99_det للبيان 'SELECT emp_name FROM emp'.
- سطر الكود 3: الإعلان عن المتغير lv_emp_name.
- سطر الكود 5: فتح المؤشر guru99_det.
- سطر الكود 6: تعيين بيان الحلقة الأساسية لجلب كافة السجلات في الجدول "emp".
- سطر الكود 7: جلب بيانات guru99_det وتعيين القيمة إلى lv_emp_name.
- سطر الكود 9: استخدام سمة المؤشر '%NOTFOUND' لمعرفة ما إذا كان قد تم جلب كل السجل الموجود في المؤشر. إذا تم جلبه، فسوف يُرجع "TRUE" وسيخرج عنصر التحكم من الحلقة، وإلا فسيستمر عنصر التحكم في جلب البيانات من المؤشر وطباعة البيانات.
- سطر الكود 11: شرط الخروج لبيان الحلقة.
- سطر الكود 12: طباعة اسم الموظف الذي تم جلبه.
- سطر الكود 14: استخدام سمة المؤشر '%ROWCOUNT' للعثور على إجمالي عدد السجلات التي تأثرت/جلبت في المؤشر.
- سطر الكود 15: بعد الخروج من الحلقة، يتم إغلاق المؤشر ويتم تحرير الذاكرة المخصصة.
FOR بيان المؤشر الدائري
يمكن استخدام عبارة "FOR LOOP" للعمل مع المؤشرات. يمكننا إعطاء اسم المؤشر بدلاً من حد النطاق في بيان حلقة FOR بحيث تعمل الحلقة من السجل الأول للمؤشر إلى السجل الأخير للمؤشر. متغير المؤشر، فتح المؤشر، جلب وإغلاق المؤشر سيتم تنفيذه ضمنيًا بواسطة حلقة FOR.
بناء الجملة
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- في بناء الجملة أعلاه، يحتوي جزء الإعلان على إعلان المؤشر.
- يتم إنشاء المؤشر لعبارة "SELECT" الواردة في إعلان المؤشر.
- في جزء التنفيذ، يتم إعداد المؤشر المُعلن في حلقة FOR وسيعمل متغير الحلقة "I" كمتغير للمؤشر في هذه الحالة.
Oracle المؤشر لحلقة المثال:
في هذا المثال، سنقوم بعرض اسم الموظف بالكامل من الجدول emp باستخدام حلقة المؤشر 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
شرح الكود
- سطر الكود 2: الإعلان عن المؤشر guru99_det للبيان 'SELECT emp_name FROM emp'.
- سطر الكود 4: إنشاء حلقة "FOR" للمؤشر باستخدام متغير الحلقة lv_emp_name.
- سطر الكود 5: طباعة اسم الموظف في كل تكرار للحلقة.
- سطر الكود 8: الخروج من الحلقة
ملاحظة: في حلقة Cursor-FOR، لا يمكن استخدام سمات المؤشر نظرًا لأن فتح المؤشر وجلبه وإغلاقه يتم ضمنيًا عن طريق لحلقة.

