利用 RAISE_APPLICATION_ERROR 存儲過程,開發者可通過導致異常,有意中止從中調用該存儲過程的 SPL 程序中的處理。

異常的處理方式與異常處理中描述的相同。此外,RAISE_APPLICATION_ERROR 存儲過程還會向程序提供用戶定義的代碼和錯誤消息,這樣可用于識別異常。

RAISE_APPLICATION_ERROR(error_number, message);

其中:

  • error_number 是一個整數值或表達式,當執行存儲過程時在名為 SQLCODE 的變量中返回。error_number 必須是介于 -20000 和 -20999 之間的值。
  • message 是一個字符串文本或表達式,在名為 SQLERRM 的變量中返回。

以下示例使用 RAISE_APPLICATION_ERROR 存儲過程根據員工缺少的信息,顯示不同的代碼和消息。

CREATE OR REPLACE PROCEDURE verify_emp (
    p_empno         NUMBER
)
IS
    v_ename         emp.ename%TYPE;
    v_job           emp.job%TYPE;
    v_mgr           emp.mgr%TYPE;
    v_hiredate      emp.hiredate%TYPE;
BEGIN
    SELECT ename, job, mgr, hiredate
        INTO v_ename, v_job, v_mgr, v_hiredate FROM emp
        WHERE empno = p_empno;
    IF v_ename IS NULL THEN
        RAISE_APPLICATION_ERROR(-20010, 'No name for ' || p_empno);
    END IF;
    IF v_job IS NULL THEN
        RAISE_APPLICATION_ERROR(-20020, 'No job for' || p_empno);
    END IF;
    IF v_mgr IS NULL THEN
        RAISE_APPLICATION_ERROR(-20030, 'No manager for ' || p_empno);
    END IF;
    IF v_hiredate IS NULL THEN
        RAISE_APPLICATION_ERROR(-20040, 'No hire date for ' || p_empno);
    END IF;
    DBMS_OUTPUT.PUT_LINE('Employee ' || p_empno ||
        ' validated without errors');
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
        DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
END;

下面顯示了員工記錄中缺少經理編號的情況下的輸出。

EXEC verify_emp(7839);

SQLCODE: -20030
SQLERRM: polar-20030: No manager for 7839