در این قسمت EXCEPTION و روش استفاده از EXCEPTION-HANDLER را توضیح می دهیم. منظور از EXCEPTION رخداد خطا در زمان اجرای برنامه است. برای مثال به دنبال اطلاعاتی هستیم که در دیتابیس وجود ندارند یا یک ورودی اشتباه به زیربرنامه ارسال می کنیم.
زبان PL/SQL با استفاده از بلاک EXCEPTION-HANDLER به برنامه نویس کمک می کند تا نوع EXCEPTION برنامه را متوجه شود و در زمان رخداد آنها دستورات مناسب را اجرا کند.
در زبان PL/SQL دو دسته EXCEPTION داریم:
1.SYSTEM-DEFINED EXCEPTION :خطاهایی که رخداد آنها توسط دیتابیس قابل تشخیص است.
2.USER-DEFINED EXCEPTON: خطاهایی که توسط برنامه نویس تعریف می شوند.
در برنامه های PL/SQLه EXCEPTIONها با استفاده از EXCEPTION-HANDLER مدیریت می شوند. در ادامه سینتکس تعریف بلاک EXCEPTION-HANDLER را در داخل یک برنامه مشاهده می کنید.
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2 THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
……..
WHEN others THEN
exception3-handling-statements
END;
در این سینتکس در زمان رخداد exceptionN، دستورهای exception-handling-statements اجرا می شوند. همچنین قسمت WHEN OTHERS مربوط به خطاهایی است که نوع آنها در تعریف EXCEPTION-HANDLER مشخص نشده است.
مثال: اطلاعات مشتری شماره 8 وجود ندارد بنابراین در زمان اجرای برنامه خطای از نوع SYSTEM-DEFINED رخ می دهد و مقدار NO_DATA_FOUND صحیح می شود.
DECLARE
c_id customers.id%type := 8;
c_name customerS.name%type;
c_addr customers.address%type;
BEGIN
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE (‘Name: ‘|| c_name);
DBMS_OUTPUT.PUT_LINE (‘Address: ‘ || c_addr);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line(‘No such customer!’);
WHEN others THEN
dbms_output.put_line(‘Error!’);
END;
/
خروجی:
No such customer!
PL/SQL procedure successfully completed.
خطاهای از نوع USER-DEFINED
برنامه نویسان می توانند بر اساس نیاز برنامه، یک خطای خاص را تعریف کنند و آن را با استفاده از بلاک HANDLER کنترل کنند. این دسته از Exeptionها ابتدا باید در قسمت DECLARE برنامه تعریف شوند و سپس رخداد آنها به صورت صریح و با کلمه کلیدی RAISE مشخص شود.
نکته: می توان بجای کلمه کلیدی RAISE از پروسیجر DBMS_STANDARD.RAISE_APPLICATION_ERROR استفاده نمود.
مثال: شماره مشتری به عنوان ورودی از کاربر پرسیده می شود و اگر این شماره کوچکتر از صفر وارود شود خطای ex_invalid_id رخ می دهد. همچنین در این مثال خطای سیستمی NO_DATA_FOUND نیز در بلاک HANDLER مشخص شده است.
DECLARE
c_id customers.id%type := &cc_id;
c_name customerS.name%type;
c_addr customers.address%type;
— user defined exception
ex_invalid_id EXCEPTION;
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE (‘Name: ‘|| c_name);
DBMS_OUTPUT.PUT_LINE (‘Address: ‘ || c_addr);
END IF;
EXCEPTION
WHEN ex_invalid_id THEN
dbms_output.put_line(‘ID must be greater than zero!’);
WHEN no_data_found THEN
dbms_output.put_line(‘No such customer!’);
WHEN others THEN
dbms_output.put_line(‘Error!’);
END;
/
خروجی(ورودی از طرف کاربر برابر با منفی شش است)
Enter value for cc_id: -6 (let’s enter a value -6)
old 2: c_id customers.id%type := &cc_id;
new 2: c_id customers.id%type := -6;
ID must be greater than zero!
PL/SQL procedure successfully completed.
خطاهای از نوع SYSTEM-DEFINED
این دسته از خطاها توسط دیتابیس قابل تشخیص هستند و به صورت اتوماتیک RAISE آنها تشخیص داده می شود. در جدول زیر برخی از خطاهای سیستمی مهم را می بینید.
نکته: توابع SQLCODE و SQLERRM کد SQL و کد مربوط به خطای اوراکل به همراه توضیحات آن را بر می گردانند.
مثال: کارمند با شماره پرسنلی 1000 وجود ندارد.
DECLARE
name employees.last_name%TYPE;
v_code NUMBER;
v_errm VARCHAR2(64);
BEGIN
SELECT last_name INTO name FROM employees WHERE employee_id = 1000;
EXCEPTION
WHEN OTHERS THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM, 1 , 64);
DBMS_OUTPUT.PUT_LINE(‘The error code is ‘ || v_code || ‘- ‘ || v_errm);
END;
/
خروجی:
The error code is 100- ORA-01403: no data found
ممنون عالی، ممنون میشم اگر مقاله ای در خصوص انواع ایندکس ها و رفتارشون منتشر کنید
تشکر از شما. حتما ولی احتمالا بعد از اتمام مباحث PL/SQL . ممنونم