Decode360's Blog

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

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

          ??? BEGIN

          ????? SELECT ...

          ????? SELECT ...

          ????? SELECT ...

          ?? ??? ...

          ??? EXCEPTION ?

          ??? WHEN NO_DATA_FOUND THEN ...

          ?
          ??? 常用類型:

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

          ??? TOO_MANY_ROWS?????? --ORA-01422--SELECT INTO 語句返回多行數(shù)據(jù)

          ??? VALUE_ERROR???????? --ORA-06502-- 類型轉(zhuǎn)換錯誤

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

          ?STORAGE_ERROR?????? --ORA-06500--PL/SQL 運(yùn)行時內(nèi)存溢出或內(nèi)存不足

          ?

          2、非預(yù)定義異常(EXCEPTION_INIT )

          ?

          ??? 方法一:

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

          ??? declare

          ??????e_deptno_remaining exception ;

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

          ??? begin

          ??? ...

          ??? exception

          ??? when e_deptno_remaining then

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

          ??? when others then

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

          ??? end ;

          ?

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

          如果需要自己設(shè)定,則必須在-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

          ?

          ?

          三、使用系統(tǒng)錯誤號和錯誤信息

          ?

          ??? 錯誤號----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;

          ?

          ?

          四、異常傳播的規(guī)則

          ?

          ??? 首先,異常是會向他的外層進(jìn)行傳遞的

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

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

          ?

          ??? 注:聲明中的異常必定無法被當(dāng)前塊捕獲

          ??? DECLARE

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

          ??? ...

          ??? BEGIN

          ??? ...

          ??? EXCEPTION

          ??? WHENOTHERSTHEN

          ??? ...

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

          ?

          ?

          ?

          posted on 2008-08-09 22:49 decode360 閱讀(1044) 評論(0)  編輯  收藏 所屬分類: 06.PLSQL
          主站蜘蛛池模板: 修文县| 敖汉旗| 历史| 六安市| 孟连| 榆树市| 南开区| 宁城县| 元氏县| 石嘴山市| 温泉县| 安远县| 噶尔县| 新民市| 宁安市| 龙川县| 云南省| 安达市| 江门市| 双江| 芦山县| 皮山县| 汉寿县| 金门县| 汝州市| 竹溪县| 怀化市| 南昌市| 定襄县| 前郭尔| 田东县| 长兴县| 海淀区| 孝昌县| 永宁县| 磐安县| 蚌埠市| 南充市| 汾西县| 吕梁市| 佳木斯市|