<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    PLSQL學習(三) 異常處理
    ?
    ??? 任何一種編程語言中的異常處理部分都是比較重要的一部分,單獨學習一下。
    ?
    ?
    一、異常的種類及基本用法:
    ?
    1、預定義異常(總計21種,具體見文檔)
    ?
    ??? 使用方法:

    ??? BEGIN

    ????? SELECT ...

    ????? SELECT ...

    ????? SELECT ...

    ?? ??? ...

    ??? EXCEPTION ?

    ??? WHEN NO_DATA_FOUND THEN ...

    ?
    ??? 常用類型:

    ??? NO_DATA_FOUND?????? --ORA-01403-- 未找到行

    ??? TOO_MANY_ROWS?????? --ORA-01422--SELECT INTO 語句返回多行數據

    ??? VALUE_ERROR???????? --ORA-06502-- 類型轉換錯誤

    ??? ZERO_DIVIDE???????? --ORA-01476-- 程序嘗試除以 0

    ?STORAGE_ERROR?????? --ORA-06500--PL/SQL 運行時內存溢出或內存不足

    ?

    2、非預定義異常(EXCEPTION_INIT )

    ?

    ??? 方法一:

    ??? 需要在declare中申明,申明后使用即與預定義異常相同

    ??? declare

    ??????e_deptno_remaining exception ;

    ?????? PRAGMA EXCEPTION_INIT (e_deptno_remaining, - 2292 );

    ??? begin

    ??? ...

    ??? exception

    ??? when e_deptno_remaining then

    ??? dbms_output.put_line( ' 非預定義2292 ' );

    ??? when others then

    ??? dbms_output.put_line( 'others' );

    ??? end ;

    ?

    -2292必須是oracle自定義的錯誤號,前面加負號

    如果需要自己設定,則必須在-20000——-20999之間

    此方法無法定義異常信息。

    ?

    ??? 方法二:

    ??? 錯誤號與錯誤信息均可自己定義

    ??? 且無需在declare和exception中聲明

    ??? declare

    ????? i int := 5;

    ??? begin

    ?????if i=5then

    ?????raise_application_error (-20086/*-20000——-20999*/, '自定義錯誤信息');

    ?????endif;

    ??? end;

    ?

    3、自定義異常(分為declare、raise、exception三部分)
    ?
    ??? 使用示例:

    ??? declare

    ????? i int := 3;

    ????? ex exception;

    ??? begin

    ????? if i <=2then

    ????? raise ex;

    ????? else dbms_output.put_line(i);?????????????????????????????

    ????? endif;

    ??? exception

    ????? when ex then

    ????? dbms_output.put_line('xxx');

    ??? end;

    ?

    ?

    二、注意使用Others的異常類:

    ?

    ??? 在EXCEPTION中定義任何的異常后

    ??? 盡量都使用when others

    ??? 表示遭遇到除此之外的任何異常如何處理

    ?

    ??? EXCEPTION

    ????? WHEN exception_name1 THEN?? -- handler

    ??????? sequence_of_statements1

    ????? WHEN exception_name2 THEN?? -- another handler

    ??????? sequence_of_statements2

    ??????? ...

    ????? WHENOTHERSTHEN??????????? -- optional handler

    ??????? sequence_of_statements3

    ??? END;?

    ?

    ??? 另外,在EXCEPTION中可以使用OR鏈接

    ??? WHEN over_limit OR under_limit OR VALUE_ERROR THEN

    ?

    ?

    三、使用系統錯誤號和錯誤信息

    ?

    ??? 錯誤號----SQLCODE;

    ??? 錯誤信息--SQLERRM;

    ??? DECLARE

    ????? err_num?? NUMBER;

    ????? err_msg?? VARCHAR2(100);

    ??? BEGIN

    ????? ...

    ??? EXCEPTION

    ????? WHENOTHERSTHEN

    ??????? err_num??? := SQLCODE;

    ??????? err_msg??? := SUBSTR(SQLERRM, 1, 100);

    ??????? dbms_output.put_line(err_num || '---' || err_msg);

    ??? END;

    ?

    ?

    四、異常傳播的規則

    ?

    ??? 首先,異常是會向他的外層進行傳遞的

    ??? 即如果在當前子塊中未定義異常處理,則會傳遞到外層的異常處理

    ??? 直到異常被捕獲或最終被拋棄

    ?

    ??? 注:聲明中的異常必定無法被當前塊捕獲

    ??? DECLARE

    ??? Abc number(3):='abc';

    ??? ...

    ??? BEGIN

    ??? ...

    ??? EXCEPTION

    ??? WHENOTHERSTHEN

    ??? ...

    ??? END;----即便使用others最終也無法捕獲

    ?

    ?

    ?

    posted on 2008-08-09 22:49 decode360 閱讀(1039) 評論(0)  編輯  收藏 所屬分類: 06.PLSQL
    主站蜘蛛池模板: 国产免费牲交视频免费播放| 国产一级理论免费版| 一本大道一卡二大卡三卡免费| 久久精品国产亚洲AV无码麻豆 | 亚洲日韩中文字幕| 亚洲免费在线观看| 日本免费v片一二三区| 3344永久在线观看视频免费首页| 一级黄色免费网站| 精品亚洲成A人在线观看青青| 亚洲一区无码中文字幕乱码| 久久亚洲私人国产精品| 亚洲国产三级在线观看| 亚洲а∨天堂久久精品| 国产无遮挡吃胸膜奶免费看| 国产乱码免费卡1卡二卡3卡| **真实毛片免费观看| 免费黄网站在线看| 两个人看的www免费高清| a高清免费毛片久久| 免费高清A级毛片在线播放| 亚洲高清乱码午夜电影网| 亚洲一区无码中文字幕乱码| 亚洲成年人免费网站| 97亚洲熟妇自偷自拍另类图片| 亚洲AV永久青草无码精品| a级亚洲片精品久久久久久久| 亚洲国产精品无码久久青草| 亚洲精品WWW久久久久久| 亚洲成人影院在线观看| 免费人成在线观看网站品爱网日本 | 歪歪漫画在线观看官网免费阅读| 99久久久精品免费观看国产| 四虎在线视频免费观看视频| 91精品免费在线观看| 免费无码又黄又爽又刺激| 大学生一级特黄的免费大片视频| 免费看的成人yellow视频| 日本成人在线免费观看| 国产片免费在线观看| 亚洲国产精品碰碰|