例外

<!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋體"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋體; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1527671778; mso-list-type:hybrid; mso-list-template-ids:-1253560558 1231345234 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-tab-stop:18.0pt; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->

例外:分爲預定義例外,非預定義例外,自定義例外

預定義例外:處理常見oracle錯誤。

非預定義例外:用於處理預定義例外所不能處理的oracle錯誤。

自定義例外:與oracle錯誤無關的情況。

一:捕獲並處理例外

DECLARE

 v_ename emp.ename%TYPE;

BEGIN

 SELECT ename INTO v_ename FROM emp

 WHERE empno=&no;

  dbms_output.put_line('僱員名:'||v_ename);

 EXCEPTION

 WHEN TOO_MANY_ROWS THEN

  dbms_output.put_line('only one row can return');

 WHEN NO_DATA_FOUND THEN

  dbms_output.put_line('NO data Found');

END;

二:常用預定義例外:21

ACCESS_INTO_NULL:當開發對象類型應用時,在引用對象屬性前必須進行初始化。如果不初始化則會報錯。

DECLARE

  emp emp_type;

 BEGIN

  emp.name:='SCOTT';

 EXCEPTION

  WHEN ACCESS_INTO_NULL THEN

  dbms_output.put_line('Init object');

END;

CASE_NOT_FOUND: CASE語句中WHEN語句沒有包含必須的條件分支即所列條件均不滿足

COLLECTION_IS_NULL:給集合賦值前(嵌套表,VARRAY)必須進行初始化。

DUP_VAL_ON_INDEX:在唯一索引上鍵入重複值

SUBSCRIPT_BEYOND_COUNT:元素下標超出範圍。

VALUE_ERROR:變量長度不足以容納實際數據-

。。。。

三:處理非預定義例外

1.       在定義部分定義例外

2.       然後建立oracle與例外的關聯

3.       引用例外

DECLARE

e_integrity EXCEPTION;

PRAGMA EXCEPTION_INIT(e_integrity,-2291);

BEGIN

UPDATE emp SET deptno=&dno WHERE empno=&eno;

EXCEPTION

WHEN e_integrity THEN

dbms_output.put_line('該部門不存在');

END;

四:處理自定義例外

DECLARE

 e_no_employee EXCEPTION;

BEGIN

  UPDATE emp SET deptno=&dno WHERE empno=&eno;

   IF SQL%FOUND THEN

    RAISE e_no_employee;

   END IF;

  EXCEPTION

  WHEN e_no_employee THEN

   dbms_output.put_line('該僱員不存在');

END;

五:SQL例外函數

SQLCODE:用於返回SQL錯誤號。

SQLERRM:用於返回錯誤消息。

DECLARE

 v_ename emp.ename%TYPE;

BEGIN

 SELECT ename INTO v_ename FROM emp

  WHERE sal=3000;

  dbms_output.put_line('僱員名:'||v_ename);

EXCEPTION

 WHEN NO_DATA_FOUND THEN

  dbms_output.put_line('不存在工資爲'||v_sal||'的僱員');

 WHEN OTHERS THEN

  dbms_output.put_line('錯誤號'||SQLCODE);

  dbms_output.put_line('錯誤MESSAGE'||SQLERRM);

END;

六:PL/SQL警告

SEVERE劇烈的):警告檢查不可預料結果或錯誤結果。

PERFORMANCE:可能引起的性能問題

INFORMATIONAL:檢查死代碼

2.控制PL/SQL警告消息

爲了使得數據庫可以在編譯PL/SQL子程序時發出警告消息,需要設置寢化參數PLSQL_WARNINGS.

不僅可以在系統級或會話級設置,也可以在ALTER PROCEDURE命令是進行設置.

既可以激活或禁止所有警告類型,也可以激活或禁止特定消息號.:

SQL> ALTER SYSTEM SET PLSQL_WARNINGS='ENABLE:ALL';

SQL> ALTER SESSION SET PLSQL_WARNINGS='ENABLE:PERFORMANCE';

SQL> ALTER PROCEDURE hello COMPILE;

2> PLSQL_WARNINGS='ENABLE:PERFORMANCE';

SQL> ALTER SESSION SET PLSQL_WARNINGS='DISABLE:ALL';

SQL> ALTER SESSION SET PLSQL_WARNINGS='ENABLE:SEVERE',

2> 'DISABLE:PERFORMANCE','ERROR:06002';

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章