قاعدة بيانات أوراكل / المتوسط: SQL التطبيقات والأدلة / الدرس 10
كتل PL/SQL والمؤشرات وعقود الأخطاء
اجمع القرارات الإجرائية وSQL المجموعي مع وضوح الإخفاق وملكية المعاملة.
في هذه الصفحة
أهداف الدرس
- افهم أقسام التصريح والتنفيذ والاستثناء في الكتلة.
- استخدم سمات المؤشر وانقل الإخفاقات ذات المعنى.
تعطي الكتلة القرارات نطاقاً
تضيف PL/SQL متغيرات وتدفق تحكم واستثناءات حول SQL. تفيد الكتلة المجهولة لعملية محلية، وتوفر الإجراءات والحزم واجهات قابلة لإعادة الاستخدام. DECLARE اختياري، ويبدأ BEGIN التنفيذ، ويقدّم EXCEPTION المعالجات، ويغلق END الكتلة. الشرطة المائلة التي تنفّذ المخزن المؤقت في SQL*Plus أو SQLcl أمر عميل وليست جزءاً من النص المخزن المرسل عبر كل موصل. سمِّ الفواصل وإعدادات المخرجات الخاصة بالعميل كي لا تُلصق في المشغّل كقواعد SQL.
تحقق من قرار المجال دون إخفاء الأخطاء
تحسب الكتلة الأولى سعراً من مدخلين رقميين محدودين. يستخدم RAISE_APPLICATION_ERROR رقماً تطبيقياً من المجال الموثق -20000 إلى -20999. ينبغي أن يصبح الوزن السالب رفضاً مقصوداً لا رسماً صفرياً مضللاً. تمثل DBMS_OUTPUT مخزناً تشخيصياً يحتاج عميلاً يفعله ويقرأه، وليست استجابة HTTP أو سجل تدقيق دائماً. يفترض المثال القيم المحلية المعروضة فقط ويوضح تدفق التحكم، ويبقى غير قابل للتشغيل لعدم استخدام بيئة أوراكل أثناء التأليف.
DECLARE
v_weight NUMBER := 3;
v_rate NUMBER := 4;
v_quote NUMBER;
BEGIN
IF v_weight <= 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Weight must be positive');
END IF;
v_quote := v_weight * v_rate;
DBMS_OUTPUT.PUT_LINE(v_quote);
END;
12
مع عميل يسترجع DBMS_OUTPUT تكون القيمة المطبوعة المنطقية 12. يؤدي تغيير الوزن إلى صفر إلى خطأ التطبيق بدلاً منها.
قد ينجح التحديث دون تغيير صفوف
تصف SQL%ROWCOUNT آخر عبارة SQL ذات صلة، لذا التقطها أو افحصها قبل أن تستبدل عبارة أخرى السياق. ترفض كتلة الحجز السعة غير المتاحة عبر نتيجة صفر صفوف. يجعل الشرط فحص السعة وخفضها عملية قاعدة واحدة بدلاً من قراءة ثم كتابة قد تستبدل قيمة أحدث. يملك المستدعي COMMIT أو ROLLBACK كي يشارك الحجز في وحدة أكبر. دالة مساعدة تثبّت داخلياً تمنع هذا التركيب وقد تحفظ نصف العملية التجارية.
BEGIN
UPDATE capacity SET free_units = free_units - 2
WHERE slot_id = 7 AND free_units >= 2;
IF SQL%ROWCOUNT <> 1 THEN
RAISE_APPLICATION_ERROR(-20002, 'Capacity reservation rejected');
END IF;
END;
تعني مطابقة صف واحد نجاح الحجز المعلق. لا يوجد COMMIT لأن الخدمة المحيطة تتحكم في المعاملة.
اختر عقد المؤشر عمداً
يتوقع SELECT ... INTO صفاً واحداً بالضبط ويرفع NO_DATA_FOUND عند الغياب وTOO_MANY_ROWS عند التعدد. لا تعادل هذه الاستثناءات تحديثاً يصيب صفر صفوف. استخدم حلقة مؤشر إذا كانت عدة صفوف مقصودة، وفضّل تحويل SQL مجموعياً إذا عبّرت عبارة واحدة عن المهمة بوضوح. قد يضيف التنفيذ صفاً صفاً انتقالات غير لازمة بين المحركين. توفر المجموعات وFORALL أدوات لحالات مناسبة، لكنها تضيف حدود مجموعات ودلالات أخطاء جزئية يجب تصميمها لا استخدامها طقساً غير مقاس للتسريع.
المعالج جزء من العقد العام
يخفي WHEN OTHERS THEN NULL الإخفاق وقد يدفع المستدعي لافتراض النجاح. عالج شرط المجال المتوقع بدقة وأعد رفع الأخطاء غير المتوقعة بعد تشخيص مصرح به. لا تضع كلمات المرور أو كامل بيانات العملاء في نص الخطأ. لا يحدد استثناء PL/SQL وحده هل يعيد التطبيق المعاملة أو يعوّض أثراً خارجياً أو يعرض رسالة تحقق؛ انشر هذه القرارات عند الواجهة. راجع المعاملات المستقلة منفصلة لأنها تثبّت بصورة مستقلة، ولا تضفها لحفظ السجل فقط دون فهم عواقب الاتساق.
الأخطاء الشائعة وإصلاحها
ORA-01403 / NO_DATA_FOUND
- لماذا يحدث؟
- لم يجد SELECT INTO صفاً مؤهلاً.
- كيف تصلحه؟
- عالج الغياب المقصود صراحة أو أصلح شرط البحث.
- كيف تتجنب تكراره؟
- وثّق هل الغياب نتيجة مجال أم خرق توقع.
ORA-01422 / TOO_MANY_ROWS
- لماذا يحدث؟
- وجد SELECT INTO أكثر من الصف المسموح.
- كيف تصلحه؟
- أصلح التفرّد أو استخدم واجهة مؤشر متعددة الصفوف مقصودة.
- كيف تتجنب تكراره؟
- ادعم البحث المفرد بقيد المفتاح الصحيح.
يُبلّغ عن عملية فاشلة كنجاح
- لماذا يحدث؟
- ابتلع معالج استثناء عام الإخفاق الأصلي.
- كيف تصلحه؟
- أعد رفع الأخطاء غير المتوقعة وحوّل نتائج المجال المراجعة فقط.
- كيف تتجنب تكراره؟
- راجع المعالجات مع عقود المعاملة والإعادة.
اختبر فهمك
1. لماذا تفحص كتلة الحجز SQL%ROWCOUNT فوراً؟
اعرض الحل المشروح
تحتاج نتيجة UPDATE نفسها لا عبارة لاحقة. صف واحد عقد النجاح، وصفر يعني عدم وقوع الانتقال المقصود. يظل على المستدعي تثبيت الوحدة الأكبر أو التراجع عنها. انتهاء الكتلة بلا خطأ صياغي لا يثبت حجز الخانة.
2. هل ينبغي لدالة حجز عامة إصدار COMMIT قبل العودة؟
اعرض الحل المشروح
فقط إذا كان ذلك الحد الدائم مسؤوليتها المنشورة صراحة. تترك دالة الحجز القابلة للتركيب القرار عادة للخدمة التي تنسق الشحنة والسعة والتدقيق. تجعل التثبيتات الخفية الحالات الجزئية دائمة وتبطل افتراضات نقاط الحفظ أو التراجع.
أهم ما تعلمته
- يكمل التحكم الإجرائي التصميم العلاقي ولا يستبدله.
- تنتمي الأخطاء والصفوف المتأثرة وملكية المعاملة لكل عقد قابل للاستدعاء.