1. 程式人生 > >pl/sql預定義異常處理

pl/sql預定義異常處理

一、概念
ORACLE預定義的異常情況大約有24個,無需在程式中定義,由ORACLE自動觸發。
二、語法

<strong><span style="color:#6633ff;">EXCEPTION
   WHEN first_exception THEN  <code to handle first exception >
   WHEN second_exception THEN  <code to handle second exception >
   WHEN OTHERS THEN  <code to handle others exception >
END;</span></strong>

三、24個預定義異常

錯誤號

異常錯誤資訊名稱

說明

ORA-0001

Dup_val_on_index

違反了唯一性限制

ORA-0051

Timeout-on-resource

在等待資源時發生超時

ORA-0061

Transaction-backed-out

由於發生死鎖事務被撤消

ORA-1001

Invalid-CURSOR

試圖使用一個無效的遊標

ORA-1012

Not-logged-on

沒有連線到ORACLE

ORA-1017

Login-denied

無效的使用者名稱/口令

ORA-1403

No_data_found

SELECT INTO沒有找到資料

ORA-1422

Too_many_rows

SELECT INTO 返回多行

ORA-1476

Zero-divide

試圖被零除

ORA-1722

Invalid-NUMBER

轉換一個數字失敗

ORA-6500

Storage-error

記憶體不夠引發的內部錯誤

ORA-6501

Program-error

內部錯誤

ORA-6502

Value-error

轉換或截斷錯誤

ORA-6504

Rowtype-mismatch

宿主遊標變數與 PL/SQL變數有不相容行型別

ORA-6511

CURSOR-already-OPEN

試圖開啟一個已處於開啟狀態的遊標

ORA-6530

Access-INTO-null

試圖為null 物件的屬性賦值

ORA-6531

Collection-is-null

試圖將Exists 以外的集合( collection)方法應用於一個null pl/sql 表上或varray上

ORA-6532

Subscript-outside-limit

對巢狀或varray索引得引用超出聲明範圍以外

ORA-6533

Subscript-beyond-count

對巢狀或varray 索引得引用大於集合中元素的個數.

四、例子

CREATE OR REPLACE PROCEDURE P_C_HANDLEEXCEPTION AS
  ------------------------------------------------------
  /*
      測試處理異常
      created by boat
      create time 2015年12月11日
  */
  ------------------------------------------------------
  v_ename   scott.emp.ename%TYPE;
BEGIN
  SELECT t.ename INTO v_ename FROM scott.emp t WHERE t.empno = '7369';
    DBMS_OUTPUT.PUT_LINE('工號為7369的員工姓名為:' || v_ename );
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('不存在工號為7369的員工');
  WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('工號被多個員工公用,請核查');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM);
END P_C_HANDLEEXCEPTION;