آموزش PL/SQL قسمت یازدهم – EXCEPTION و EXCEPTION-HANDLER در PL/SQL

در این قسمت 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

Comment (1)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.