Oracle مؤشر PL/SQL: ضمني، صريح، للحلقة مع المثال

⚡ ملخص ذكي

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

  • 📍 مجال السياق: يشير المؤشر إلى منطقة السياق التي تخزن عبارة SQL ومجموعة البيانات النشطة التي تم إرجاعها.
  • ⚙️ المؤشر الضمني: Oracle يفتح مؤشرًا ضمنيًا تلقائيًا لكل عبارة DML و SELECT INTO لصف واحد.
  • ✋ مؤشر صريح: يقوم المبرمج بتعريف وفتح وجلب وإغلاق مؤشر صريح للتحكم الكامل.
  • 🔎 خصائص المؤشر: تشير %FOUND و%NOTFOUND و%ISOPEN و%ROWCOUNT إلى حالة العملية الأخيرة.
  • 🔁 حلقة تكرار المؤشر: تقوم حلقة FOR بفتح المؤشر وجلب البيانات وإغلاقه ضمنيًا، دون الحاجة إلى خطوات يدوية.
  • 🤖 مساعدة الذكاء الاصطناعي: تقوم المساعدات المدعومة بالذكاء الاصطناعي مثل GitHub Copilot بإنشاء حلقات المؤشر ووضع علامة على المؤشرات غير المغلقة.

Oracle مؤشر PL/SQL ضمني وصريح وحلقة FOR

ما هو المؤشر في 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.

مثال على استخدام المؤشر الصريح لجلب أسماء الموظفين من جدول الموظفين في Oracle PL / SQL

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.

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

المؤشر المرجعي (متغير المؤشر) هو مؤشر إلى مجموعة نتائج الاستعلام. على عكس المؤشر الثابت، يمكنه فتح استعلامات مختلفة أثناء التشغيل وتمرير النتائج بين كتل PL/SQL أو إلى برامج العميل.

يقوم المؤشر العادي بجلب صف واحد لكل عملية جلب، مما يتسبب في العديد من عمليات تبديل السياق. جمع بالجملة يقوم بتحميل العديد من الصفوف في مجموعة واحدة في عملية جلب واحدة، مما يقلل بشكل كبير من الحمل الزائد على مجموعات النتائج الكبيرة.

نعم. قم بتعريف مؤشر مُعامل مثل CURSOR c(dept NUMBER) IS SELECT …، ثم مرر القيم عند فتح c(10). تتيح لك المعاملات إعادة استخدام تعريف مؤشر واحد مع قيم تصفية مختلفة.

تقوم عبارة FOR UPDATE بقفل الصفوف التي يحددها المؤشر بحيث لا يمكن لأي شخص آخر تغييرها. ثم تقوم عبارة WHERE CURRENT OF بتحديث أو حذف الصف المحدد الذي تم جلبه للتو، دون تكرار شرط WHERE.

تحتفظ المؤشرات المفتوحة بذاكرتها المحجوزة وتُحتسب ضمن حد OPEN_CURSORS. يؤدي ترك العديد من المؤشرات مفتوحة في النهاية إلى ظهور الخطأ ORA-01000: تجاوز الحد الأقصى للمؤشرات المفتوحة، لذا أغلق المؤشر المحدد دائمًا بعد استخدامه.

كل عملية جلب (FETCH) تتنقل بين محركي PL/SQL وSQL. تتراكم آلاف عمليات تبديل السياق هذه، لذا فإن عبارة SQL واحدة قائمة على مجموعة أو عملية تجميع مجمعة (BULK COLLECT) عادةً ما تعالج نفس الصفوف بشكل أسرع بكثير.

نعم. مساعد الطيار جيثب يقوم بصياغة حلقات OPEN و FETCH و CLOSE الصريحة أو حلقات المؤشر FOR من تعليق، ويضيف فحوصات الخروج %NOTFOUND، ويقترح أسماء السمات، على الرغم من أنه يجب عليك مراجعة المنطق أولاً.

تُشير مساعدات الذكاء الاصطناعي إلى حلقات المؤشر التي تُنفذ صفًا تلو الآخر والتي قد تتحول إلى استعلامات SQL قائمة على المجموعات أو عمليات تجميع البيانات المجمعة، وتكتشف المؤشرات غير المغلقة، وتشرح سلوك سمات %attribute. تُحسّن هذه المراجعة القائمة على التعلم الآلي الأداء قبل وصول الكود إلى مرحلة الإنتاج.

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