<!-- /* 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';