RM新时代国际平台

  • <div id="r605l"></div>
      1. <th id="r605l"></th>
      2. ORACLE PL/SQL中異常處理全面分析

        PL/SQL異常處理是PL/SQL塊中對執(zhí)行部分出現異常進行處理的部分。PL/SQL采用的是統(tǒng)一異常處理機制,當異常發(fā)生時,程序會自動跳轉到異常處理部分,交給異常處理程序進行異常匹配,再調用對應的處理方法。如果程序出現異常,而沒有找到對應的異常處理程序,則程序會直接中斷拋出異常。PL/SQL異常可以分為預定義異常、非預定義異常、自定義異常三種。

        PL/SQL異常處理都在PL/SQL塊的最下方,以EXCEPTION開始,其語句結構如下:

        declare

        --聲明部分

        begin

        --執(zhí)行部分

        exception

        --異常部分

        when exception1 then

        --異常1處理程序

        [when exception2 then

        --異常2處理程序 ]

        [when others then

        --其它異常處理程序 ]

        end;

        語法解析:

        1、exception是異常處理部分開始的標志。

        2、when后面是跟著異常的名稱, then后面是對應異常處理程序。也就是當異常exception1出現時,執(zhí)行的是異常1處理程序。其它異常程序不會進入。

        3、when others then 指的是異常再前面異常捕獲中未捕獲到對應的異常處理程序,則全部進入其它異常處理程序進行異常處理。

        預定義異常Oracle數據庫為我們預定義好開發(fā)過程當中經常出現的異常名稱。Oracle一共提供了25種預定義異常名稱,常用到的如我們使用select ...into語句進行賦值時,經常出現的NO_DATA_FOUND(select查詢時無數據不能賦值給變量錯誤)、TOO_MANY_ROWS(查詢返回記錄不止一條,觸發(fā)的錯誤)等。25種預定義異常,可以通過數據庫語句查詢,命令如下:

        select * from dba_source t where t.TEXT like '%EXCEPTION_INIT%' AND NAME='STANDARD';

        結果如下:

        案例1、測試預定義異常,代碼如下:

        declare

        ls_stuinfo stuinfo%rowtype;

        begin

        select t.* into ls_stuinfo

        from stuinfo t

        where t.stuid='SC2018010061';

        --該學號找不到對應的學生

        exception

        when no_data_found then

        dbms_output.put_line('該學生在學生信息表中找不到');

        end;

        結果如下:

        Oracle當中除了上面存在的25種預定義異常,更多存在的是非預定義的異常。也就是說,它們只存在錯誤編號和對應的錯誤信息,但是沒有具體的錯誤名稱的對應。雖然,Oracle數據庫自己預定義了25種常見異常,但是對于其他異常,你可以選擇為異常添加一個名稱,使得它能夠被異常處理模塊進行捕獲并拋出處理。

        定義非預定義異常,可以分為兩步走:

        1、進行異常聲明:聲明一個異常名稱。

        2、進行異常名稱和錯誤編號關聯(lián)。

        Oracle處理非預定義的異常和預定義異常的原理是一致的,非預定義異常只是自己給對應的Oracle錯誤編號起個自己的名字,而預定義異常是Oracle數據自己起的名字。

        案例2、演示非預定義異常的編寫,代碼如下:

        declare

        ex_only exception;--聲明一個異常名稱

        PRAGMA EXCEPTION_INIT(ex_only,-00001);--主鍵唯一性錯誤

        begin

        update stuinfo t set t.stuid='SC201801005'

        where t.stuid='SC201801006';

        exception

        --捕獲異常

        when ex_only then

        dbms_output.put_line('該學號已經存在,不應許修改');

        when others then

        dbms_output.put_line(sqlerrm);

        end;

        結果如下:

        除了,上面的預定義異常外,Oracle還為開發(fā)者提供一個異常處理方式,那就是自定義異常,可以根據自己實際的業(yè)務需求和邏輯錯誤進行自定義異常,并通過邏輯控制主動拋出自定義異常交給對應的異常處理模塊,進行異常處理。進行自定義異常的步驟如下:

        1、異常聲明定義:在PL/SQL塊的聲明部分采用關鍵字EXCEPTION定義異常名稱。

        2、異常主動拋出:在PL/SQL塊中執(zhí)行部分,通過邏輯控制,主動使用RAISE關鍵字拋出異常,交給異常處理模塊處理。

        案例3、自定義異常演示,代碼如下:

        declare

        ex_check_sex exception;--聲明一個異常名稱

        ls_sex stuinfo.sex%type;

        begin

        select t.sex into ls_sex from stuinfo t where t.stuid = 'SC201801006';

        dbms_output.put_line('該學生的性別是:'||ls_sex);--1:男,2:女

        if ls_sex not in ('1','2') then

        --性別不是1或者2主動拋出異常

        raise ex_check_sex;

        end if;

        exception

        --捕獲異常

        when ex_check_sex then

        dbms_output.put_line('性別只能是男或者女');

        when others then

        dbms_output.put_line(sqlerrm);

        end;

        結果如下:


        下一篇:oracle RAC
        RM新时代国际平台
      3. <div id="r605l"></div>
          1. <th id="r605l"></th>
          2. <div id="r605l"></div>
              1. <th id="r605l"></th>
              2. 新时代RM|国际平台 新时代软件下载 RM新时代官网网址 rm新时代是正规平台 新时代rm平台入口