8- الاستثنائات

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 20

‫معالجة االستثناءات‬

‫األهداف للمحاضرة‬

‫‪ ‬تعريف االستثناءات‬
‫‪ ‬أنواع االستثناءات‬
‫‪ ‬كيفية معالجة ك"ل نوع من االستثناءات‬
‫االستثناءات‬
‫‪‬ماهي االستثناءات؟‬
‫االستثناءات عبارة عن األخطاء التي ممكن أن تظهر خالل‬
‫عملية تنفيذ وحدة (‪ )Block‬وفي حال ظهورها تؤدي إلى‬
‫وقف" عملية التنفيذ‪.‬‬
‫االستثناءات‬
‫‪ ‬تنقسم االستثناءات إلى ‪ 3‬أقسام‪:‬‬
‫‪ -1‬األخطاء المعرفة مسبقا (‪)Predefined Oracle Server errors‬‬

‫‪ -2‬األخطاء الغير معرفة مسبقا (‪)Non-Predefined Oracle server errors‬‬

‫‪ -3‬استثناءات معرفة بواسطة المستخدم (‪)User Defined Exceptions‬‬

‫‪ ‬تتم معالجة االستثناءات في الجزء الخاص باالستثناءات في وحدة ال(‪)Block‬‬


‫معالجة االستثناءات‬
DECLARE
....
BEGIN
….
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
...
[WHEN exception3 [OR exception4 . . .] THEN
statement1; ‫هنا تتم معالجة االستثناءات‬
statement2; ‫واإلمساك بها‬
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]
‫معالجة االستثناءات‬
‫‪ -1‬األخطاء المعرفة مسبقا (‪:)Predefined Oracle Server errors‬‬
‫هي عبارة عن ‪ 20‬خطأ لكل منها اسم ‪,‬ويتم اإلمساك بها في جزء االستثناءات‬
‫داخل وحدة (‪ )Block‬وذلك لمعالجتها عن طريق كتابة إجراء معين يتم عمله عند ظهور الخطأ‪.‬‬
‫الجدول التالي يبين بعض منها‪:‬‬
‫االستثناء‬ ‫الوصف‬
‫‪ZERO_DEVIDE‬‬ ‫القسمة على صفر‬
‫‪VALUE_ERROR‬‬ ‫خطأ في عملية حسابية أو تحويل أو خطأ في‬
‫الحجم‬
‫‪TOO_MANY_ROWS‬‬ ‫جملة االسترجاع (‪)Select‬أعادت أكثر من صف‬
‫‪NO_DATA_FOUND‬‬ ‫جملة االسترجاع (‪ )Select‬لم تعد أي نتيجة‬
‫‪NOT_LOGGED_ON‬‬ ‫محاولة إجراء عملية على قاعدة البيانات دون‬
‫دخول‪.‬‬

‫باإلضافة الى ‪ DUP_VAL_ON_INDEX‬وتظهر عند محاولة تكرار رقم مفتاح اساسي‬


‫معالجة االستثناءات‬
‫(األخطاء المعرفة مسبقا)‬
‫‪ ‬مثال‪ :‬لنقم بإنشاء جدول اسمه ‪ emp‬كما هو موضح ادناه‬
‫معالجة االستثناءات‬
)‫(األخطاء المعرفة مسبقا‬
201 ‫ استرجاع اسم الموظف رقم‬:‫ مثال‬
DECLARE
v_ename emp2.name%Type;

Begin
SELECT name
INTO v_ename
From emp2
WHERE id = 201;
DBMS_OUTPUT.PUT_LINE ('Employee Name is ' || v_ename );
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE (' Invalid Employee Number ' || v_empid);

END;
‫معالجة االستثناءات‬
)‫(األخطاء المعرفة مسبقا‬
it ‫ استرجاع اسم الموظف في قسم‬:‫ مثال‬
DECLARE
v_name emp.name%Type;

BEGIN
SELECT name
INTO v_name
FROM emp
WHERE position=‘it’
DBMS_OUTPUT.PUT_LINE ('Employee Name is ' || v_ename );
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('There is no Employee has this ');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE ('The position has more than one Employee ' );
END;
‫معالجة االستثناءات‬
‫(األخطاء المعرفة مسبقا)‬
‫‪ ‬تمرين ‪: 1‬‬
‫‪ ‬انشئي جدول الموظفين السابق‬
‫‪ ‬قم بإنشاء كتلة برم"جيه تقوم باالستعالم عن موظف ‪ admin‬وقم بطباعته ‪.‬‬
‫‪ ‬قم بمعالجة الخطأ الذي سوف يظه"ر باستخدام االستثناءات ‪.‬‬

‫‪ ‬تمرين ‪: 2‬‬
‫‪ ‬قم بإنشاء كتلة برمجية تقوم بإضافة بيانات طالب الى الجدول بحيث ان االيدي‬
‫م"فتاح أساسي وقم بإضافة رقم طالب" م"كرر وقم بتشغ"يله‬
‫‪ ‬قم بمعالجة الخطأ بحيث يتم طباعة جملة ال يمك"ن تكرار رقم الموظف ألنه مفتاح‬
‫اساسي ‪.‬‬
‫معالجة االستثناءات‬
‫‪ -2‬األخطاء الغير معرفة مسبقا‪:‬‬
‫عبارة عن أي خطأ من أخطاء أوركال غير تلك المعرفة مسبقا وتظهر ضمنيا ولكن يجب تعريفها في الجزء التعريفي‬
‫(‪.)Declarative section‬‬

‫‪ ‬للتعامل مع هذا النوع من االستثناءات‪:‬‬


‫‪ -1‬نقوم بتعريف االستثناء في الجزء التعريفي لل( ‪:)Block‬‬
‫‪DECLARE‬‬
‫‪…..‬‬
‫;‪Exception_name EXCEPTION‬‬
‫‪ -2‬ربط االستثناء مع الخطأ في الجزء التعريفي بعد تعريف االستثناء باستخدام‬
‫( ‪:)PRAGMA_EXCEPTION_INIT‬‬
‫;)‪PRAGMA EXCEPTION_INIT(Exception_name ,error_number‬‬
‫‪ -3‬معالجة االستثناء في جزء االستثناءات في وحدة ال( ‪:)Block‬‬
‫يتم ذلك عن طريق كتابة ‪:‬‬
‫‪WHEN Exception_name THEN‬‬

‫كتابة الجمل المناسبة للمعالجة‬


‫معالجة االستثناءات‬
‫(األخطاء الغير معرفة مسبقا)‬
‫معالجة االستثناءات‬
‫(األخطاء الغير معرفة مسبقا)‬

‫مثال‬
‫لنقم بإنشاء جدول‬
‫‪Create table countries (id number(3) primary key not null , name‬‬
‫;) ‪varchar(30) not null‬‬
‫الحظ ان العمودين تم وضع شرط ان ال تكون قيمة فارغه‬
‫سوف نقوم بإضافة مستخدم‬
‫;) ’‪Insert into countries values (1 , ‘ksa‬‬
‫معالجة االستثناءات‬
‫(األخطاء الغير معرفة مسبقا)‬
‫االن سوف نقوم بإضافة بيانات احدهما فارغ وسوف نرى الخطأ وكيفية عمل استثناء‬
‫‪begin‬‬
‫;)'‪insert into countries values (null , ' ksa‬‬
‫;‪End‬‬
‫عند التنفيذ سوف تظهر رسالة الخطأ التالية‬
‫)"‪ORA-01400: cannot insert NULL into ("ABDULELAH"."COUNTRIES"."ID‬‬
‫ما يهمنا هو كود الخطأ الذي يظهر وكيفية معالجته‬
‫ج"زء ت"""ع"ريفا""لمتغيرا"ت ‪Declare‬‬
‫ع"رفنا متغير منن""وع ا"ستثناء ;‪ex exception‬‬
‫ا"ستخدمنا دا""لة ل""ربط ا""لمتغير ب"""نوع ا""لخطأ ;)‪pragma exception_init( ex , -01400‬‬
‫ا""لبدا"ية ‪Begin‬‬
‫ق""منا ب"""محاولة ا"ضافه" ب"""ياناتف"""ارغة ف"""ا""لجدول ;)'‪insert into countries values (null , ' kuwait‬‬
‫‪Exception‬‬ ‫ج"زء ا""الستثناء‬
‫‪when ex then‬‬ ‫مع"ا""لجة ا""الستثناء‬
‫ا""لجملة ا""لتيي""تم" طباعته"ا او عملحلل "ه"ذا ا""لخطأ ;)'‪dbms_output.put_line(‘cannot insert null values‬‬
‫;‪end‬‬
‫معالجة االستثناءات‬
‫‪ -3‬االستثناءات المعرفة من قبل المستخدم‪:‬‬
‫هي" عبارة عن أي حدث يعتبره المستخدم خطأ يوجب وقف تنفيذ ال(‪,)Block‬وعلى" المستخدم تعريفه في" جزء التعريفات وإظهاره‬
‫باستخدام (‪.)RAISE‬‬

‫‪ ‬للتعامل مع هذا النوع من االستثناءات‪:‬‬


‫‪ -1‬نقوم بتعريف االستثناء في الجزء التعريفي لل(‪:)Block‬‬
‫‪DECLARE‬‬
‫‪…..‬‬
‫;‪Exception_name EXCEPTION‬‬
‫‪ -2‬إظهار االستثناء في الجزء التنفيذي من ال(‪ )Block‬نتيجة أي حدث يعتبره المستخدم خطأ عن طريق استخدام (‪)RAISE‬‬
‫‪Begin‬‬
‫‪….‬‬
‫; ‪RAISE Exception_name‬‬
‫‪….‬‬
‫‪ -3‬معالجة االستثناء في جزء االستثناءات في وحدة ال(‪:)Block‬‬
‫يتم ذلك عن طريق كتابة ‪:‬‬
‫‪WHEN Exception_name THEN‬‬
‫كتابة الجمل الناسبة للمعالجة‬
‫معالجة االستثناءات‬
‫(االستثناءات المعرفة من قبل المستخدم)‬

‫في جزء التعريفات‬ ‫في الجزء التنفيذي‬ ‫في جزء االستثناءات‬


‫معالجة االستثناءات‬
‫(االستثناءات المعرفة من قبل المستخدم)‬
‫مثال‬
‫لنقم بإنشاء جدول معلمين‬
‫;) ‪Create table teachers (id number , name varchar2(30) , salary number‬‬

‫‪begin‬‬
‫;)‪Insert into teachers values (1 , ‘ali’ , 2000‬‬
‫;)‪Insert into teachers values (2 , ‘khalid’ , 1900‬‬
‫;)‪Insert into teachers values (3 , ‘hassan’ , 3000‬‬
‫;)‪Insert into teachers values (4 , ‘faisal’ , 2500‬‬
‫;‪End‬‬
‫سنقوم بإنشاء كتلة برمجيه تقوم بزيادة راتب المعلم في الصف رقم ‪ 2‬بمقادر ‪ 200‬لاير وسنطبع تم‬
‫تحديث راتب الموظف‬
‫وفي حال كان راتبة اكثر من ‪ 2000‬لن نزيد الراتب وسنطبع جملة راتب الموظف عالي‬
‫معالجة االستثناءات‬
‫(االستثناءات المعرفة من قبل المستخدم)‬
‫‪Declare‬‬ ‫ج‪l‬زء ا‪ll‬لتع‪l‬ريف‬
‫ق‪ll‬منا ب‪ll‬تع‪l‬ريفمتغير ن‪ll‬وعه‪ l‬ن‪ll‬فسن‪ll‬وع ا‪ll‬لعمود ;‪v_name teachers.name%type‬‬
‫ق‪ll‬منا ب‪ll‬تع‪l‬ريفمتغير منن‪ll‬فسن‪ll‬وع ا‪ll‬لعمود ;‪v_salary teachers.salary%type‬‬
‫ق‪ll‬منا ب‪ll‬تع‪l‬ريفا‪l‬ستثناء ;‪ex exception‬‬
‫ا‪ll‬لبدا‪l‬ية ‪Begin‬‬
‫ا‪l‬ستعلم‪ l‬عنا‪ll‬السم‪ l‬وا‪ll‬لرا‪l‬تب ‪select name , salary‬‬
‫وق‪l‬م‪ l‬ب‪ll‬تخزينه‪l‬ا دا‪l‬خلا‪ll‬لمتغيرين ‪into v_name , v_salary‬‬
‫منا‪ll‬لجدول ‪from teachers‬‬
‫ف‪lll‬يا‪ll‬لمكانا‪ll‬ليف‪lll‬يه‪ l‬ا ‪l‬اليديي‪ll‬ساوي‪where id =2; 2‬‬
‫ش‪ll‬رط اذا ك‪l‬انا‪ll‬لرا‪l‬تبف‪lll‬يا‪ll‬لمتغير ا‪l‬كبر من‪2000‬ق‪ll‬م‪ l‬ب‪ll‬تنفيذ ا‪ll‬الستثناء ‪if v_salary > 2000 then‬‬
‫;‪raise ex‬‬
‫;‪end if‬‬
‫ف‪lll‬يح‪l‬ا ‪l‬لل‪l‬م‪ l‬ي‪ll‬تم‪ l‬ت‪ll‬نفيذ ا‪ll‬الستثناء س‪ll‬نقوم‪ l‬ب‪ll‬تع‪l‬ديلرا‪l‬تبا‪ll‬لموظف ‪update teachers‬‬
‫را‪l‬تبا‪ll‬لموظفي‪ll‬ساوين‪ll‬فسا‪ll‬لرا‪l‬تبونزيد عليه‪set salary = salary + 200 200 l‬‬
‫ف‪lll‬يا‪ll‬لصفا‪ll‬ليف‪lll‬يه‪ l‬ا ‪l‬اليديي‪ll‬ساوي‪where id = 2; 2‬‬
‫وق‪l‬م‪ l‬ب‪ll‬طباعة ت‪ll‬م‪ l‬ت‪ll‬حديثا‪ll‬لرا‪l‬تبب‪ll‬شكلص‪ll‬حيح ;)'‪dbms_output.put_line('succefuly update the salary‬‬
‫ب‪ll‬دا‪l‬ية ج‪l‬زء ا‪ll‬الستثناء ‪Exception‬‬
‫اذا ت‪ll‬حققا‪ll‬الستثناء ق‪ll‬م‪ l‬ب‪ll‬تنفيذ ا‪ll‬لكود ا‪l‬سفلة ‪when ex then‬‬
‫طباعة ج‪l‬ملة ا‪ll‬لرا‪l‬تبعا‪ll‬لي ;)'‪dbms_output.put_line('salry is hight‬‬
‫;‪end‬‬
‫معالجة االستثناءات‬
‫‪ ‬استخدام ‪ SQLCODE‬و‪: SQLERRM‬‬
‫‪ SQLCODE‬و ‪SQLERRM‬عبارة عن دوال يمكن استخدامها في‬
‫معالجة االستثناءات‪.‬‬
‫‪ : SQLCODE‬دا""لة ت"""ع"يد رقم" ا""لخطأ ا""لذيح ‪.‬‬
‫"دث‬
‫‪ : SQLERRM‬دا""لة ت"""عيد رسا""لة وصفل""لخطأ ا""لذيح ‪.‬‬
‫"دث‬

‫‪SQLCODE‬‬ ‫الوصف‬
‫‪0‬‬ ‫لم يظهر أي استثناء‬
‫‪1‬‬ ‫استثناء معرف من قبل المستخدم‬
‫‪100+‬‬ ‫‪NO_DATA_FOUND‬‬
‫رقم سالب‬ ‫أ"يخطأ منأ"خطاء ‪ORECALE‬‬
‫معالجة االستثناءات‬
DECLARE
v_deptno NUMBER := 500;
v_name VARCHAR2 (20) := 'Testing';
e_invalid_dept EXCEPTION;
BEGIN
UPDATE departments ‫النتيجة من تنفيذ‬
SET department_name = v_name )Block(‫الوحدة‬
WHERE department_id = v_deptno;
IF SQL%NOTFOUND THEN
No such department
RAISE e_invalid_dept;
User-Defined
END IF;
Exception
ROLLBACK;
1
EXCEPTION
WHEN e_invalid_dept THEN
DBMS_OUTPUT.PUT_LINE ('No such department');
DBMS_OUTPUT.PUT_LINE (SQLERRM);
DBMS_OUTPUT.PUT_LINE (SQLCODE);
END;
/
PL/SQL procedure successfully completed. The command succeeded

You might also like