Professional Documents
Culture Documents
8- الاستثنائات
8- الاستثنائات
األهداف للمحاضرة
تعريف االستثناءات
أنواع االستثناءات
كيفية معالجة ك"ل نوع من االستثناءات
االستثناءات
ماهي االستثناءات؟
االستثناءات عبارة عن األخطاء التي ممكن أن تظهر خالل
عملية تنفيذ وحدة ( )Blockوفي حال ظهورها تؤدي إلى
وقف" عملية التنفيذ.
االستثناءات
تنقسم االستثناءات إلى 3أقسام:
-1األخطاء المعرفة مسبقا ()Predefined Oracle Server errors
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
مثال
لنقم بإنشاء جدول
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
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