با عرض سلام و خسته نباشید خدمت کاربران محترم سایت آموزشی پی وی لرن. و کاربرانی که آموزش کامل PL/SQL را دنبال می کنند. در این پست آموزشی، ما درباره Exceptions در PL / SQL ( استثناء در PL / SQL ) صحبت خواهیم کرد. یک استثنا یک وضعیت خطا در طی اجرای برنامه است. PL / SQL از برنامه نویسان برای گرفتن چنین شرایطی با استفاده از بلوک EXCEPTION در برنامه پشتیبانی می کند و اقدام مناسب در برابر شرایط خطا انجام می شود. دو نوع استثنا در PL / SQL وجود دارد:
نحوه کلی اداره استثناء به شرح زیر است:
در اینجا شما می توانید لیست استثناءهای زیادی را که می توانید مرتکب شوید را فهرست کنید.
استثناء پیش فرض با استفاده از WHEN THEM پردازش می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; |
اجازه دهید یک کد برای نشان دادن مفهوم بنویسیم.
ما از جدول مشتریان که در جلسه های قبلی ایجاد کرده ایم استفاده می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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; / |
هنگامی که کد بالا در SQL فوری اجرا می شود، نتیجه زیر را تولید می کند.
1 2 3 | No such customer! PL/SQL procedure successfully completed. |
برنامه فوق نشان دهنده نام و آدرس مشتری است که شناسه داده شده است.
از آنجا که هیچ مشتری با ID شماره ۸ در پایگاه داده ما وجود ندارد، این برنامه باعث افزایش استثناء زمان اجرا NO_DATA_FOUND می شود که در بلوک EXCEPTION گرفته شده است.
استثنائات توسط سرور پایگاه داده به صورت خودکار هر وقت خطایی در پایگاه داده داخلی ایجاد می شود، اما با استفاده از دستور RAISE می توان استثنا را به صراحت توسط برنامه نویس مطرح کرد.
در زیر نحوه ی ساده برای ایجاد استثنا نشان داده شده است.
1 2 3 4 5 6 7 8 9 10 | DECLARE exception_name EXCEPTION; BEGIN IF condition THEN RAISE exception_name; END IF; EXCEPTION WHEN exception_name THEN statement; END; |
شما می توانید از سینتکس بالا در بالا بردن استاندارد استثنا استاندارد اوراکل یا Exceptions در PL / SQL تعریف شده توسط کاربر استفاده کنید.
در بخش بعدی، به شما نمونه ای در مورد افزایش استثناء تعریف شده توسط کاربر داده می شود.
شما می توانید استثنائات استاندارد اوراکل را به روش مشابهی افزایش دهید.
PL / SQL به شما اجازه می دهد Exceptions در PL / SQL خود را با توجه به نیاز برنامه خود تعریف کند.
یک استثناء تعریف شده توسط کاربر باید اعلام شود و سپس صریح با استفاده از عبارت RAISE یا روش DBMS_STANDARD.RAISE_APPLICATION_ERROR مطرح شود.
نحوه اعلام استثناء
1 2 | DECLARE my-exception EXCEPTION; |
مثال زیر این مفهوم را نشان می دهد. که برنامه برای شناسایی مشتری درخواست می کند،
هنگامی که کاربر وارد یک شناسه نامعتبر است، invalid_id استثنا مطرح شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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; / |
هنگامی که کد بالا در SQL فوری اجرا می شود، نتیجه زیر را تولید می کند.
1 2 3 4 5 6 | 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 |
PL / SQL بسیاری از Exceptions در PL / SQL از پیش تعیین شده را فراهم می کند و زمانی اجرا می شوند
که هر یک از دستورات پایگاه داده توسط یک برنامه نقض شده باشد.
به عنوان مثال، استثناء در PL / SQL از پیش تعیین شده NO_DATA_FOUND هنگامی که یک دستور SELECT INTO هیچ ردیفی باز نمی شود، مطرح می شود.
نام استثنا | خطای اوراکل | کد SQL | شرح |
---|---|---|---|
ACCESS_INTO_NULL | ۰۶۵۳۰ | -۶۵۳۰ | هنگامی که یک شیء صفر به صورت خودکار مقدار تعیین می شود، مطرح می شود. |
CASE_NOT_FOUND | ۰۶۵۹۲ | -۶۵۹۲ | این زمانی مطرح می شود که هیچ کدام از گزینه های WHEN clause یک CASE انتخاب نمی شود و هیچ بند ELSE وجود ندارد. |
COLLECTION_IS_NULL | ۰۶۵۳۱ | -۶۵۳۱ | هنگامی که یک برنامه تلاش می کند روش های جمع آوری شده به غیر از EXISTS را به یک جدول توپی غیر توقیف نشده یا varray اعمال کند، یا برنامه تلاش می کند تا مقادیر را به عناصر یک جدول غیر توقیف شده یا متغیر اختصاص دهد، مطرح می شود. |
DUP_VAL_ON_INDEX | ۰۰۰۰۱ | -۱ | هنگامی که مقادیر تکراری در یک ستون با شاخص منحصر به فرد ذخیره می شوند، افزایش می یابد. |
INVALID_CURSOR | ۰۱۰۰۱ | -۱۰۰۱ | هنگامی که تلاش برای ایجاد یک عملگر مکان نما که مجاز نیست، مانند بستن یک مکان نما باز نشده، مطرح می شود. |
INVALID_NUMBER | ۰۱۷۲۲ | -۱۷۲۲ | هنگامی که تبدیل یک رشته کاراکتر به یک عدد رخ می دهد، افزایش می یابد زیرا رشته یک عدد معتبر را نشان نمی دهد. |
LOGIN_DENIED | ۰۱۰۱۷ | -۱۰۱۷ | هنگامی که یک برنامه تلاش می کند تا با استفاده از نام کاربری یا رمز عبور نامعتبر به پایگاه داده وارد شود، مطرح می شود. |
NO_DATA_FOUND | ۰۱۴۰۳ | +۱۰۰ | هنگامی که یک دستور SELECT INTO هیچ ردیفی باز نمی شود، مطرح می شود. |
NOT_LOGGED_ON | ۰۱۰۱۲ | -۱۰۱۲ | هنگامی که یک تماس پایگاه داده بدون اتصال به پایگاه داده صادر می شود، مطرح می شود. |
PROGRAM_ERROR | ۰۶۵۰۱ | -۶۵۰۱ | هنگامی که PL / SQL دارای یک مشکل داخلی است مطرح می شود. |
ROWTYPE_MISMATCH | ۰۶۵۰۴ | -۶۵۰۴ | هنگامی که یک مکان نما مقدار ارزش را در یک متغیر دارای نوع داده ناسازگار به دست می آورد بالا می رود. |
SELF_IS_NULL | ۳۰۶۲۵ | -۳۰۶۲۵ | وقتی یک متد عضو فراخوانی می شود، آن مطرح می شود، اما نمونه نوع شیء مقداردهی نشده است. |
STORAGE_ERROR | ۰۶۵۰۰ | -۶۵۰۰ | هنگامی که PL / SQL از حافظه خارج شد یا حافظه خراب شد، مطرح می شود. |
TOO_MANY_ROWS | ۰۱۴۲۲ | -۱۴۲۲ | هنگامی که یک دستور SELECT INTO بیشتر از یک ردیف باز می شود، افزایش می یابد. |
VALUE_ERROR | ۰۶۵۰۲ | -۶۵۰۲ | زمانی که یک خطای حساب، تبدیل، قطع، یا محدودیت زمانی رخ می دهد، مطرح می شود. |
ZERO_DIVIDE | ۰۱۴۷۶ | ۱۴۷۶ | هنگامی که یک تلاش برای تقسیم یک عدد صفر انجام می شود، افزایش می یابد. |
این جلسه بحث ما در مورد Exceptions در PL / SQL ( استثناء در PL / SQL ) بود.
که توضیح مختصری در مورد پردازش استثناء در PL / SQL ، استثنائات تعریف شده توسط کاربر و استثناء در PL / SQL از پیش تعریف شده نیز داده شد.
امیدواریم راضی بوذه باشید.