Òì³£´íÎó´¦Àí
Ò»¸öÓÅÐãµÄ³ÌÐò¶¼Ó¦¸ÃÄܹ»ÕýÈ·´¦Àí¸÷ÖÖ³ö´íÇé¿ö£¬²¢¾¡¿ÉÄÜ´Ó´íÎóÖлָ´¡£ORACLE ÌṩÒì³£Çé¿ö(EXCEPTION)ºÍÒì³£´¦Àí(EXCEPTION HANDLER)À´ÊµÏÖ´íÎó´¦Àí
¢ÙÓÐÈýÖÖÀàÐ͵ÄÒì³£´íÎó£º
1£® Ô¤¶¨Òå( Predefined )´íÎó
ORACLEÔ¤¶¨ÒåµÄÒì³£Çé¿ö´óÔ¼ÓÐ24¸ö¡£¶ÔÕâÖÖÒì³£Çé¿öµÄ´¦Àí£¬ÎÞÐèÔÚ³ÌÐòÖж¨Ò壬ÓÉORACLE×Ô¶¯½«ÆäÒý·¢¡£
2£® ·ÇÔ¤¶¨Òå( Predefined )´íÎó
¼´ÆäËû±ê×¼µÄORACLE´íÎó¡£¶ÔÕâÖÖÒì³£Çé¿öµÄ´¦Àí£¬ÐèÒªÓû§ÔÚ³ÌÐòÖж¨Ò壬ȻºóÓÉORACLE×Ô¶¯½«ÆäÒý·¢¡£
3£® Óû§¶¨Òå(User_define) ´íÎó
³ÌÐòÖ´Ðйý³ÌÖУ¬³öÏÖ±à³ÌÈËÔ±ÈÏΪµÄ·ÇÕý³£Çé¿ö¡£¶ÔÕâÖÖÒì³£Çé¿öµÄ´¦Àí£¬ÐèÒªÓû§ÔÚ³ÌÐòÖж¨Ò壬ȻºóÏÔʽµØÔÚ³ÌÐòÖн«ÆäÒý·¢¡£
¢ÚÒì³£´¦Àí²¿·ÖÒ»°ã·ÅÔÚPL/SQL ³ÌÐòÌåµÄºó°ë²¿,½á¹¹Îª:
EXCEPTION
WHEN first_exception THEN
WHEN second_exception THEN
WHEN OTHERS THEN
END;
Òì³£´¦Àí¿ÉÒÔ°´ÈÎÒâ´ÎÐòÅÅÁÐ,µ«OTHERS ±ØÐë·ÅÔÚ×îºó.
¢ÛÔ¤¶¨ÒåµÄÒì³£´¦Àí
¶ÔÕâÖÖÒì³£Çé¿öµÄ´¦Àí£¬Ö»ÐèÔÚPL/SQL¿éµÄÒì³£´¦Àí²¿·Ö£¬Ö±½ÓÒýÓÃÏàÓ¦µÄÒì³£Çé¿öÃû£¬²¢¶ÔÆäÍê³ÉÏàÓ¦µÄÒì³£´íÎó´¦Àí¼´¿É¡£
[Ô¤¶¨ÒåÒì³£]
declare
v_sal employees.salary%type;
begin
select salary into v_sal
from employees
where employee_id >100;
dbms_output.put_line(v_sal);
exception
when Too_many_rows then dbms_output.put_line('Êä³öµÄÐÐÊýÌ«¶àÁË');
end;
¢Ü·ÇÔ¤¶¨ÒåµÄÒì³£´¦Àí
¶ÔÓÚÕâÀàÒì³£Çé¿öµÄ´¦Àí£¬Ê×ÏȱØÐë¶Ô·Ç¶¨ÒåµÄORACLE´íÎó½øÐж¨Òå¡£²½ÖèÈçÏ£º
1. ÔÚPL/SQL ¿éµÄ¶¨Ò岿·Ö¶¨ÒåÒì³£Çé¿ö£º
<Òì³£Çé¿ö> EXCEPTION;
2. ½«Æä¶¨ÒåºÃµÄÒì³£Çé¿ö£¬Óë±ê×¼µÄORACLE´íÎóÁªÏµÆðÀ´£¬Ê¹ÓÃPRAGMA EXCEPTION_INIT Óï¾ä£º
PRAGMA EXCEPTION_INIT(<Òì³£Çé¿ö>, <´íÎó´úÂë>);
3. ÔÚPL/SQL ¿éµÄÒì³£Çé¿ö´¦Àí²¿·Ö¶ÔÒì³£Çé¿ö×ö³öÏàÓ¦µÄ´¦Àí¡£
[·ÇÔ¤¶¨ÒåÒì³£]
declare
v_sal employees.salary%type;
--ÉùÃ÷Ò»¸öÒì³£
delete_mgr_excep exception;
--°Ñ×Ô¶¨ÒåµÄÒì³£ºÍoracleµÄ´íÎó¹ØÁªÆðÀ´
PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);
begin
delete from employees
where employee_id = 100;
select salary into v_sal
from employees
where employee_id >100;
dbms_output.put_line(v_sal);
exception
when Too_many_rows then dbms_output.put_line('Êä³öµÄÐÐÊýÌ«¶àÁË');
when delete_mgr_excep then dbms_output.put_line('Manager²»ÄÜÖ±½Ó±»É¾³ý');
end;
¢ÝÓû§×Ô¶¨ÒåµÄÒì³£´¦Àí
µ±ÓëÒ»¸öÒì³£´íÎóÏà¹ØµÄ´íÎó³öÏÖʱ£¬¾Í»áÒþº¬´¥·¢¸ÃÒì³£´íÎó¡£Óû§¶¨ÒåµÄÒì³£´íÎóÊÇͨ¹ýÏÔʽʹÓÃRAISEÓï¾äÀ´´¥·¢¡£µ±Òý·¢Ò»¸öÒì³£´íÎóʱ£¬¿ØÖƾÍתÏòµ½EXCEPTION¿éÒì³£´íÎ󲿷֣¬Ö´ÐдíÎó´¦Àí´úÂë¡£
¶ÔÓÚÕâÀàÒì³£Çé¿öµÄ´¦Àí£¬²½ÖèÈçÏ£º
1£® ÔÚPL/SQL ¿éµÄ¶¨Ò岿·Ö¶¨ÒåÒì³£Çé¿ö£º
<Òì³£Çé¿ö> EXCEPTION;
2£® RAISE <Òì³£Çé¿ö>£»
3£® ÔÚPL/SQL ¿éµÄÒì³£Çé¿ö´¦Àí²¿·Ö¶ÔÒì³£Çé¿ö×ö³öÏàÓ¦µÄ´¦Àí¡£
[Óû§×Ô¶¨ÒåÒì³£]
declare
v_sal employees.salary%type;
--ÉùÃ÷Ò»¸öÒì³£
delete_mgr_excep exception;
--°Ñ×Ô¶¨ÒåµÄÒì³£ºÍoracleµÄ´íÎó¹ØÁªÆðÀ´
PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);
--ÉùÃ÷Ò»¸öÒì³£
too_high_sal exception;
begin
select salary into v_sal
from employees
where employee_id =100;
if v_sal > 1000 then
raise too_high_sal;
end if;
delete from employees
where employee_id = 100;
dbms_output.put_line(v_sal);
exception
when Too_many_rows then dbms_output.put_line('Êä³öµÄÐÐÊýÌ«¶àÁË');
when delete_mgr_excep then dbms_output.put_line('Manager²»ÄÜÖ±½Ó±»É¾³ý');
--´¦ÀíÒì³£
when too_high_sal then dbms_output.put_line('¹¤×ʹý¸ßÁË');
end;
¢ÞÔÚPL/SQL ÖÐʹÓÃSQLCODE, SQLERRM
SQLCODE ·µ»Ø´íÎó´úÂëÊý×Ö
SQLERRM ·µ»Ø´íÎóÐÅÏ¢.
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||¡¯---¡®||SQLERRM);
¢ßÒì³£³ÌÐò:
1.ͨ¹ý select ... into ... ²éѯijÈ˵Ť×Ê, ÈôûÓвéѯµ½, ÔòÊä³ö "δÕÒµ½Êý¾Ý"
declare
--¶¨ÒåÒ»¸ö±äÁ¿
v_sal employees.salary%type;
begin
--ʹÓà select ... into ... Ϊ v_sal ¸³Öµ
select salary into v_sal from employees where employee_id = 1000;
dbms_output.put_line('salary:¡¡' || v_sal);
exception
when No_data_found then
dbms_output.put_line('δÕÒµ½Êý¾Ý');
end;
»ò
declare
--¶¨ÒåÒ»¸ö±äÁ¿
v_sal employees.salary%type;
begin
--ʹÓà select ... into ... Ϊ v_sal ¸³Öµ
select salary into v_sal from employees;
dbms_output.put_line('salary:¡¡' || v_sal);
exception
when No_data_found then
dbms_output.put_line('δÕÒµ½Êý¾Ý!');
when Too_many_rows then
dbms_output.put_line('Êý¾Ý¹ý¶à!');
end;
2. ¸üÐÂÖ¸¶¨Ô±¹¤¹¤×Ê£¬È繤×ÊСÓÚ300£¬Ôò¼Ó100£»¶Ô NO_DATA_FO