تعرف على كيفية التعامل مع الاستثناءات في PL / SQL



هذه المقالة عبارة عن دليل شامل حول كيفية إجراء معالجة الاستثناءات في PL / SQL من خلال مناقشة الأنواع المختلفة من الاستثناءات المعروضة في PL / SQL.

إذا كنت مبرمجًا ، فقد تكون على دراية بمفهوم معالجة الاستثناءات التي تعد جزءًا لا يتجزأ من أي منها . نظرًا لأن الأخطاء أمر لا مفر منه وحتى أذكى منا يمكن أن يرتكب أخطاء أثناء كتابة التعليمات البرمجية ، يجب أن نكون على دراية بكيفية التعامل معها. في هذه المقالة ، سنتعلم بشكل خاص عن معالجة الاستثناءات في PL / SQL.

معالجة استثناءات SQL في PL / SQL-Edurekaفيما يلي الموضوعات التي تم تناولها في هذه المقالة:





ما هو الاستثناء؟

أي حالة أو حدث غير طبيعي يقطع التدفق الطبيعي لتعليمات برنامجنا في وقت التشغيل أو بكلمات بسيطة استثناء هو خطأ.

بناء جملة معالجة الاستثناءات في PL / SQL

قم بإعلان الاستثناء عند الاستثناء 1 ثم الاستثناء 1 - عبارات المعالجة عند الاستثناء 2 ثم الاستثناء 2 - التعامل - العبارات عند الاستثناء 3 ثم الاستثناء 3 - التعامل - العبارات ........ عند الاستثناءات الأخرى - العبارات - المعالجة - النهاية

هنا ، يمكننا إدراج العديد من الاستثناءات التي نريد التعامل معها. سيتم التعامل مع الاستثناء الافتراضي باستخدام 'عندما يكون الآخرون بعد ذلك'



مثال على معالجة الاستثناءات في PL / SQL

يعرض البرنامج أدناه اسم وعنوان الطالب المعطى هويته. نظرًا لعدم وجود طالب يحمل قيمة المعرف 8 في قاعدة البيانات الخاصة بنا ، يقوم البرنامج برفع استثناء وقت التشغيل NO_DATA_FOUND ، والذي تم تسجيله في كتلة EXCEPTION.

DECLARE s_id studentS.id٪ type: = 8 s_name studentS.Name٪ type s_loc studentS.loc٪ type BEGIN SELECT name ، loation INTO s_name ، s_loc من الطلاب WHERE id = s_id DBMS_OUTPUT.PUT_LINE ('الاسم:' || s_name) DBMS_OUTPUT .PUT_LINE ('الموقع:' || s_loc) استثناء عند العثور على no_data_line ثم dbms_output.put_line ('لا يوجد مثل هذا الطالب!') عندما يكون الآخرون بعد ذلك dbms_output.put_line ('عفوًا ، خطأ!') النهاية

انتاج |

لا يوجد مثل هذا الطالب! تم إكمال إجراء PL / SQL بنجاح.

هنا ، يمكننا إدراج العديد من الاستثناءات التي نريد التعامل معها. سيتم التعامل مع الاستثناء الافتراضي باستخدام عندما الآخرين '

أنواع الاستثناءات في PL / SQL

  • نظام محدد
  • تحدى المستخدم

التالي في هذه المقالة حول معالجة الاستثناءات في PL / SQL ، دعونا نناقش حول كلا النوعين بالتفصيل.



نظام محدد

يتم تعريف هذه الاستثناءات وصيانتها ضمنيًا بواسطة خادم Oracle ، ويتم تحديد هذه الاستثناءات بشكل أساسي في حزمة Oracle Standard Package. عند حدوث استثناء داخل البرنامج ، يتطابق خادم Oracle ويحدد الاستثناء المناسب من مجموعة الاستثناءات المتاحة المتاحة في حزمة oracle القياسية. في الأساس ، يتم تحديد هذه الاستثناءات مسبقًا في PL / SQL الذي يربى عند انتهاك قاعدة قاعدة بيانات معينة .

ال الاستثناءات التي يحددها النظام تنقسم كذلك إلى فئتين:

  • استثناءات النظام المسماة
  • استثناءات النظام بدون اسم

استثناءات النظام المسماة

استثناءات PL / SQL المسماة اسمه في الحزمة القياسية من PL / SQL ، وبالتالي لا يحتاج المطور إلى تحديد استثناءات PL / SQL في التعليمات البرمجية الخاصة بهم. يوفر PL / SQL العديد من الاستثناءات المسماة المحددة مسبقًا ، والتي يتم تنفيذها عند انتهاك أي قاعدة قاعدة بيانات بواسطة برنامج. يسرد الجدول التالي عددًا قليلاً من الاستثناءات المحددة مسبقًا والناقص

كومة وكومة الذاكرة في جافا
استثناء خطأ أوراكل SQLCODE وصف
ACCESS_INTO_NULL06530-6530يتم رفعه عندما يتم تعيين قيمة لكائن فارغ تلقائيًا.
CASE_NOT_FOUND06592-6592يتم رفعه عند عدم وجود أي من الاختيارات في جملة WHEN الخاصة بـ بيان الحالة ، ولا توجد عبارة ELSE.
COLLECTION_IS_NULL06531-6531يتم رفعه عندما يحاول أحد البرامج تطبيق طرق تجميع أخرى غير EXISTS على جدول متداخل أو متغير غير مهيأ ، أو يحاول البرنامج تعيين قيم لعناصر جدول متداخل أو متغير غير مهيأ.
DUP_VAL_ON_INDEX00001-واحديتم رفعه عند محاولة تخزين القيم المكررة في عمود به فهرس فريد.
INVALID_CURSOR01001-1001يتم رفعه عند إجراء محاولات لإجراء عملية مؤشر غير مسموح بها ، مثل إغلاق مؤشر غير مفتوح.
رقم غير صالح01722-1722يتم رفعه عند فشل تحويل سلسلة الأحرف إلى رقم لأن السلسلة لا تمثل رقمًا صالحًا.
تم رفض تسجيل الدخول01017-1017يتم رفعه عندما يحاول أحد البرامج تسجيل الدخول إلى قاعدة البيانات باستخدام اسم مستخدم أو كلمة مرور غير صالحة.
لاتوجد بيانات01403+100يتم رفعه عندما ترجع عبارة SELECT INTO عدم وجود صفوف.
NOT_LOGGED_ON01012-1012يتم رفعه عند إصدار استدعاء قاعدة البيانات دون الاتصال بقاعدة البيانات.
PROGRAM_ERROR06501-6501يتم رفعه عندما يكون لدى PL / SQL مشكلة داخلية.
ROWTYPE_MISMATCH06504-6504يتم رفعه عندما يجلب المؤشر قيمة في متغير له نوع بيانات غير متوافق.
SELF_IS_NULL30625-30625يتم رفعه عند استدعاء أسلوب عضو ، ولكن لم تتم تهيئة مثيل نوع الكائن.
STORAGE_ERROR06500-6500يتم رفعه عند نفاد ذاكرة PL / SQL أو تلف الذاكرة.
TOO_MANY_ROWS01422-1422يتم رفعه عندما ترجع عبارة SELECT INTO أكثر من صف واحد.
VALUE_ERROR06502-6502يتم رفعه عند حدوث خطأ في الحساب أو التحويل أو الاقتطاع أو الحجم.
ZERO_DIVIDE014761476يتم رفعه عند محاولة قسمة رقم على صفر.

مثال

إنشاء أو استبدال الإجراء add_new_student (الطالب _id_in IN NUMBER ، الطالب _name_in IN VARCHAR2) هو BEGIN INSERT INTO الطالب (الطالب _id ، الطالب _name) VALUES (الطالب _id_in ، الطالب _name_in) استثناء عند DUP_VAL_ON_INDEX_EN000 'رفع -2' ) عند غير ذلك من حالات 'خطأ في التطبيق' (-20002 ، 'حدث خطأ.') النهاية

الانتقال في هذه المقالة حول معالجة الاستثناءات في PL / SQL ، دعونا نفهم ما هي استثناءات النظام غير المسماة.

استثناءات النظام بدون اسم

تُعرف استثناءات النظام التي لا تحمل Oracle اسمًا لها باسم استثناءات النظام غير المسماة. لا تحدث هذه الاستثناءات بشكل متكرر وتتم كتابتها مع رمز ورسالة مرتبطة.

هناك طريقتان أساسيتان للتعامل مع استثناءات النظام غير المسماة:

1. استخدام معالج استثناء WHEN OTHERS

2. إقران رمز الاستثناء باسم واستخدامه كاستثناء مسمى.

بعض الخطوات المتبعة لاستثناءات النظام غير المسماة هي:

  • رفعها ضمنا.
  • في حالة عدم التعامل معها في 'عندما يتم التعامل مع الآخرين' ، يجب التعامل معها بشكل صريح.
  • لمعالجة الاستثناء بشكل صريح ، يمكن التصريح عنها باستخدام Pragma EXCEPTION_INIT ومعالجتها من خلال الرجوع إلى اسم الاستثناء المحدد من قبل المستخدم في قسم الاستثناء.

يتم توفير مثال لمعالجة الاستثناءات غير المسماة باستخدام Pragma EXCEPTION_INIT لاحقًا في المقالة. الانتقال في هذه المقالة حول معالجة الاستثناءات في PL / SQL ، دعونا نفهم الاستثناءات المعرفة من قبل المستخدم.

تعريف المستخدم

مثل جميع لغات البرمجة الأخرى ، تسمح لك Oracle أيضًا بإعلان تنفيذ الإعلان لاستثناءاتك الخاصة. بخلاف الاستثناءات التي يحددها النظام ، تظهر هذه الاستثناءات بشكل صريح في كتلة PL / SQL.

خطوات إعلان الاستثناءات المعرفة من قبل المستخدم في قاعدة بيانات Oracle

يمكننا تحديد الاستثناءات المعرفة من قبل المستخدم في قاعدة بيانات Oracle بالطرق الثلاث التالية:

  • استخدام متغير من نوع EXCEPTION

هنا ، يمكننا أن نعلن عن استثناء معرّف من قبل المستخدم عن طريق التصريح عن متغير EXCEPTION نوع البيانات في التعليمات البرمجية الخاصة بنا ورفعها صراحة في برنامجنا باستخدام بيان RAISE.

  • استخدام وظيفة PRAGMA EXCEPTION_INIT

يمكننا تحديد رقم خطأ غير محدد مسبقًا باستخدام متغير نوع بيانات EXCEPTION

  • باستخدام طريقة RAISE_APPLICATION_ERROR

باستخدام هذه الطريقة ، يمكننا إعلان استثناء معرّف من قبل المستخدم برقم ورسالة الخطأ المخصصة الخاصة بنا.

حتى الآن قد تكون لديك فكرة تقريبية عن الطرق التي يمكننا من خلالها زيادة الاستثناءات التي يحددها المستخدم في PL / SQL. سنتعرف على كل من الطرق المذكورة أعلاه مع أمثلة إضافية في هذه المقالة حول معالجة الاستثناءات في PL / SQL.

بعد ذلك في هذه المقالة ، دعنا نتابع عروض معالجة الاستثناءات المعرفة من قبل المستخدم.

إظهار الاستثناءات التي يحددها المستخدم

الانتقال في هذه المقالة حول معالجة الاستثناءات في PL / SQL ، دعنا نفهم كيفية استخدام متغير نوع EXCEPTION.

استخدام متغير من نوع EXCEPTION

تنقسم عملية إعلان استثناء معرّف من قبل المستخدم إلى ثلاثة أجزاء وهذه الأجزاء الثلاثة هي:

  • قم بتعريف نوع بيانات استثناء متغير
  • ارفع الاستثناء
  • تعامل مع الاستثناء

دعنا نكتب رمزًا لشرح الخطوات المذكورة أعلاه بالتفصيل.

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION

في قالب الإعلان أعلاه ، لدينا أربعة متغيرات ، من بينها الثلاثة الأولى متغيرات نوع بيانات الرقم العادي والرابع وهو ex_DivZero هو متغير نوع بيانات الاستثناء الخاص. الرابع هو الاستثناء الذي يحدده المستخدم.

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION

جزء التنفيذ أعلاه من هذه الكتلة المجهولة ، لن يدخل حيز التنفيذ إلا عندما يكون المقسوم عليه 0. إذا كان المقسوم عليه صفرًا كما هو في حالتنا ، فسيتم رفع الخطأ وسيتخطى التحكم في البرنامج جميع الخطوات التالية و سيبحث عن معالج الاستثناء المطابق. في حالة العثور على أي شيء آخر ، فسيقوم بتنفيذ الإجراء وفقًا لذلك ، وإلا فإنه إما سينهي البرنامج أو يطالبنا بخطأ محدد غير معالج من قبل النظام.

استثناء عند ex_DivZero ثم DBMS_OUTPUT.PUT_LINE ('خطأ ، لا يمكن للمقسوم عليه أن يكون صفرًا')

هذا هو معالج الاستثناء. بمجرد أن يقوم المستخدم بإدخال القاسم على 0 ، ستتم مطالبة سلسلة الرسالة أعلاه.

الكود النهائي:

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION BEGIN IF var_divisor = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE (IF var_divisor) || = 0 ثم RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('النتيجة =' || var_result) END

الانتقال في هذه المقالة حول معالجة الاستثناءات في PL / SQL ، دعنا نفهم كيفية استخدام طريقة PRAGMA_EXCEPTION_INIT.

استخدام وظيفة PRAGMA EXCEPTION_INIT

في ال دالة PRAGMA EXCEPTION_INIT ، يقترن اسم استثناء برقم خطأ أوراكل. يمكن استخدام هذا الاسم في تصميم معالج الاستثناء للخطأ.بالنسبة للمشاريع الضخمة التي تحتوي على العديد من الأخطاء التي يحددها المستخدم ، فإن PRAGMA EXCEPTION_INIT هي الطريقة الأكثر فائدة وملاءمة.

بناء الجملة:

PRAGMA EXCEPTION_INIT (استثناء_اسم ، -Oracle_error_number)

مثال

DECLARE deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected، -60) BEGIN NULL - بعض العمليات التي تتسبب في حدوث خطأ ORA-00060 باستثناء عند اكتشاف deadlock_detected ثم NULL - معالجة الخطأ النهاية

يخبر PRAGMA EXCEPTION_INIT المترجم بربط اسم استثناء برقم خطأ أوراكل كما ذكرنا سابقًا. يتيح لك الرجوع إلى أي استثناء داخلي بالاسم وكتابة معالج محدد له. عندما ترى مكدس أخطاء ، أو تسلسل رسائل خطأ ، فإن الرسالة الموجودة في الأعلى هي التي يمكن حصرها والتعامل معها.

الانتقال في هذه المقالة حول معالجة الاستثناءات في PL / SQL ، دعنا نفهم كيفية استخدام طريقة RAISE_APPLICATION_ERROR.

الضحلة مقابل نسخة جافا العميقة

باستخدام طريقة RAISE_APPLICATION_ERROR

إنه إجراء يأتي في ثناياه عوامل مع برنامج oracle. باستخدام هذا الإجراء ، يمكننا ربط رقم خطأ برسالة خطأ مخصصة. من خلال الجمع بين كل من رقم الخطأ ورسالة الخطأ المخصصة ، يمكن تكوين سلسلة خطأ تبدو مشابهة لسلاسل الخطأ الافتراضية التي يتم عرضها بواسطة أوراكل عند مواجهة خطأ. تم العثور على إجراء RAISE_APPLICATION_ERROR داخل حزمة DBMS_STANDARD

بناء الجملة

lift_application_error (error_number، message [، TRUE])

مثال

/ * تم إنشاء مشغل trg_emp_detail_chk. * / إنشاء أو استبدال TRIGGER trg_emp_detail_chk / * يتم الإعلان عن توقيت المشغل قبل التحديث في جدول الموظفين. * / قبل التحديث على الموظفين ، قم بإلغاء تحديد إذن _ رفض استثناء B IFEGIN / * بدء التحقق من الشرط يوم من وقت النظام هو إما السبت أو الأحد أم لا. * / IF تقليم (TO_CHAR (sysdate، 'Day')) IN ('Saturday'، 'Sunday') ثم lift_application_error (-20000 ، 'لا يحق لك القيام بذلك أي تعديل في عطلة نهاية الأسبوع !! ') / * يتم استدعاء الإجراء lift_application_error مع قيمة المعلمة الأولى كـ -20000 والمعامل الثاني بنص افتراضي يفيد بأن المستخدم غير مصرح له بإجراء أي تعديل في عطلات نهاية الأسبوع. * / END IF END

بهذا نصل إلى نهاية هذه المقالة حول 'معالجة الاستثناءات في PL / SQL'. أتمنى أن يتم فهم هذا الموضوع جيدًا وأن يساعدك. حاول كتابة الرموز الخاصة بك ودمج الطرق الموضحة في هذه المقالة.

إذا كنت ترغب في الحصول على تدريب من محترفين على هذه التكنولوجيا ، يمكنك اختيار التدريب المنظم من edureka! ألق نظرة على هذا من Edureka ، وهي شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرين في جميع أنحاء العالم. تدربك هذه الدورة على المفاهيم الأساسية والأدوات والتقنيات المتقدمة لإدارة البيانات وإدارة قاعدة بيانات MySQL. يتضمن التعلم العملي على مفاهيم مثل MySQL Workbench و MySQL Server ونمذجة البيانات وموصل MySQL وتصميم قاعدة البيانات وسطر أوامر MySQL ووظائف MySQL وما إلى ذلك. في نهاية التدريب ، ستكون قادرًا على إنشاء وإدارة قاعدة بيانات MySQL الخاصة بك وإدارتها البيانات.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في مقالة 'معالجة الاستثناءات في PL / SQL' وسنعاود الاتصال بك في أقرب وقت ممكن.