真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Oracle專題13之異常錯誤處理

1、異常處理的概念與分類

a、什么是異常?

  • 異常:是程序在正常執(zhí)行過程中發(fā)生的未預(yù)料的事件。

    b、什么是異常處理?

  • 異常處理是為了提高程序的健壯性,使用異常處理部分可以有效地解決程序正常執(zhí)行過程中可能出現(xiàn)的各種錯誤,使得程序正常運行。

    c、異常處理的語法格式

    EXCEPTION 
    WHEN first_exception THEN 
        statement1;
        ......
    WHEN second_exception THEN 
        statement1;
        ......
    WHEN OTHERS THEN
        statement1;
        ......

    d、異常處理代碼的PL/SQL塊中的位置

    DECLARE
        /*
        *  聲明部分--聲明變量、常量、復(fù)雜數(shù)據(jù)類型、游標等
        */
    BEGIN
        /*
        *  執(zhí)行部分--PL/SQL語句和SQL語句
        */
    EXCEPTION
     /*
     *  異常處理部分--處理運行錯誤
     */
     END; --塊結(jié)束標記
  • 簡單示例代碼:查詢指定部門的所有員工姓名和工資。
    DECLARE
        v_name emp.ename%TYPE;
        v_sal emp.sal%TYPE;
    BEGIN
        SELECT ename, sal INTO v_name, v_sal FROM emp  WHERE empno = &no;
        IF v_sal < 3000 THEN 
            dbms_output.put_line(v_name || '的工資是:' || v_sal);
            END IF;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            dbms_output.put_line('員工號輸入錯誤!');
        WHEN OTHERS THEN 
            dbms_output.put_line('其他錯誤!');
    END;

    e、異常的分類

  • 預(yù)定義異常、非預(yù)定義異常和自定義異常

    2、預(yù)定義異常

  • 預(yù)定義異常是指由PL/SQL所提供的系統(tǒng)異常,Oracle提供了20多個預(yù)定義異常,每個預(yù)定義異常對應(yīng)一個特定的Oracle錯誤,當PL/SQL塊出現(xiàn)這些Oracle錯誤時,會隱含地觸發(fā)相應(yīng)的預(yù)定義異常。
    Oracle專題13之異常錯誤處理
  • 對于預(yù)定義異常情況的處理,無需在程序中定義,只需要在PL/SQL塊中的異常處理部分,直接引用相應(yīng)的異常情況名,并對其完成相應(yīng)的異常錯誤處理即可。
  • 示例代碼:根據(jù)輸入的工資,查詢員工的姓名。并輸出員工的姓名以及工資。
        DECLARE
            v_name emp.ename%TYPE;
            v_sal emp.sal%TYPE := &salary;
        BEGIN
            SELECT ename INTO v_name FROM emp WHERE sal = v_sal;
            DBMS_OUTPUT.put_line(v_name || '的工資是:' || v_sal);
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                DBMS_OUTPUT.put_line('沒有該工資的員工');
            WHEN TOO_MANY_ROWS THEN
                DBMS_OUTPUT.put_line('多個員工具有該工資');
            WHEN OTHERS THEN
                DBMS_OUTPUT.put_line('其他錯誤');
        END;

    3、非預(yù)定義異常

  • 用于處理預(yù)定義異常所不能夠處理的ORACLE錯誤,此種異常需要在程序中定義。

    a、非預(yù)定義異常的處理包括3步

    1、在PL/SQL塊中定義部分定義異常情況:<異常情況> EXCEPTION;
    2、將其定義好的異常情況與標準的ORACLE錯誤聯(lián)系起來,使用PRAGMA EXCEPTION_INIT語句:PRAGMA EXCEPTION_INIT(<異常情況>, <錯誤代碼>);
    3、在PL/SQL塊的異常情況處理部分對異常情況做出相應(yīng)的處理。

    創(chuàng)新互聯(lián)公司是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計公司的優(yōu)秀設(shè)計人員和策劃人員組成的一個具有豐富經(jīng)驗的團隊,其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設(shè)計師、平面廣告設(shè)計師、網(wǎng)絡(luò)營銷人員及形象策劃。承接:網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)頁設(shè)計制作、網(wǎng)站建設(shè)與維護、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫開發(fā),以高性價比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺等全方位的服務(wù)。

    b、代碼演示

  • 刪除dept表中指定部分的信息。(刪除部門時應(yīng)該保證指定部門中沒有員工,因為dept和emp表存在主外鍵關(guān)系)
    1、當刪除有其員工的部門時,獲取錯誤號:
    BEGIN
        DELETE FROM dept WHERE deptno = &deptno;
    EXCEPTION
        WHEN OTHERS THEN
            dbms_output.put_line(SQLCODE || '###' || SQLERRM);
    END;
  • 當按F8執(zhí)行,鍵入20后,控制臺打印如下內(nèi)容:
    -2292###ORA-02292: 違反完整約束條件 (SCOTT.FK_DEPTNO) - 已找到子記錄

    2、刪除dept表中指定部分的信息:

    DECLARE
        --1、定義非預(yù)定義異常的標識符
        e_fk EXCEPTION;
        --2、把Oracle錯誤和異常信息建立關(guān)聯(lián)
        -- -2292 違反外鍵約束的錯誤號
        PRAGMA EXCEPTION_INIT(e_fk, -2292);
    BEGIN
        DELETE FROM dept WHERE deptno = &deptno;
    EXCEPTION
        WHEN e_fk THEN
            -- 3、捕捉并處理異常
            dbms_output.put_line('此部門下有員工,不能刪除!');
        WHEN OTHERS THEN
            dbms_output.put_line(SQLCODE || '###' || SQLERRM);
    END;   
  • 當按下F8執(zhí)行,鍵入20后,控制臺打印如下內(nèi)容:
    此部門下有員工,不能刪除!

    4、自定義異常

  • 如果你想在某個特定事件發(fā)生時向應(yīng)用程序的用戶發(fā)出一些警告信息。而事件本身不會拋出Oracle內(nèi)部異常,這個異常是屬于應(yīng)用程序的特定異常。那么就需要自定義異常。
  • 用戶定義的異常錯誤時通過顯式使用RAISE語句來觸發(fā)的。當引發(fā)一個異常錯誤時,控制就轉(zhuǎn)向到EXCEPTION塊異常錯誤部分,執(zhí)行錯誤處理代碼。

    a、自定義異常的處理步驟

  • 對于這類異常情況的處理,步驟如下:
    1、在PL/SQL塊的聲明部分定義異常情況:<異常情況> EXCEPTION;
    2、RAISE <異常情況>
    3、在PL/SQL塊的異常處理部分對異常情況做出相應(yīng)的處理。

    b、示例代碼

  • 更新指定員工編號的員工工資:
    DECLARE
        v_empno emp.empno%TYPE := &empno;
        e_no_result EXCEPTION;
    BEGIN
        UPDATE emp SET sal = sal + 100 WHERE empno = v_empno;
        IF SQL%NOTFOUND THEN
            RAISE e_no_result;
        ELSE
            COMMIT;
        END IF;
    EXCEPTION
        WHEN e_no_result THEN
            dbms_output.put_line('數(shù)據(jù)更新失敗!');
        WHEN OTHERS THEN 
            dbms_output.put_line('其他錯誤');
    END;

    5、SQLCODE和SQLERRM

    a、異常處理函數(shù)

  • 異常處理函數(shù)用于取得Oracle錯誤號和錯誤信息,其中函數(shù)SQLCODE用于取得錯誤號,SQLERRM用于取得錯誤信息。
  • 當編寫PL/SQL塊時,通過在異常處理部分引用函數(shù)SQLCODE和SQLERRM,可以取得未預(yù)計到的Oracle錯誤。
  • 另外,通過使用內(nèi)置過程RAISE_APPLICATION_ERROR,可以在建立子程序(過程、函數(shù)、包)時自定義錯誤號和錯誤信息。

    b、異常處理函數(shù)示例代碼

  • 插入員工信息(包括員工號、員工名和員工所屬部門號):
    DECLARE
        v_empno emp.empno%TYPE := &empno;
        v_ename emp.ename%TYPE := '&ename';
        v_deptno emp.deptno%TYPE := &deptno;
    BEGIN
        INSERT INTO emp(empno, ename, deptno) VALUES(v_empno, v_ename, v_deptno);
        IF SQL%FOUND THEN
            DBMS_OUTPUT.put_line('數(shù)據(jù)插入成功');
            COMMIT; 
        END IF;
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.put_line('錯誤號:' || SQLCODE);
            DBMS_OUTPUT.put_line('錯誤信息:' || SQLERRM);
    END;  

    c、RAISE_APPLICATION_ERROR

  • 該過程用于在PL/SQL子程序中自定義錯誤信息。
  • 語法格式為:
    raise_application_error(error_number, message);
  • error_number:用于定義錯誤號(-20000~-20999)。
  • message:用于指定錯誤信息,長度不能超過2048個字節(jié)。

文章名稱:Oracle專題13之異常錯誤處理
文章路徑:http://weahome.cn/article/jdpocg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部