发出应用程序错误 (PL/SQL)

RAISE_APPLICATION_ERROR 过程根据由用户提供的错误码和消息发出异常。此过程只有在 PL/SQL 上下文中才受支持。

语法

阅读语法图跳过直观语法图RAISE_APPLICATION_ERROR(错误号 ,消息, keeperrorstackfalse );

描述

错误号
特定于供应商的编号,在将此编号存储在名为 SQLCODE 的变量中之前,将它映射到错误码。RAISE_APPLICATION_ERROR 过程接受用户定义的 错误号 值 -20000 到 -20999。在错误消息中返回的 SQLCODE 是 SQL0438N。SQLSTATE 包含类“UD”以及三个字符,这三个字符与 错误号 值的最后三个数字相对应。
消息
用户定义的消息,其最大长度为 70 个字节。
keeperrorstack
用于指示是否应该保留错误堆栈的可选布尔值。当前,仅支持缺省值 false

示例

以下示例使用 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;

CALL verify_emp(7839);

SQLCODE: -438
SQLERRM: SQL0438N  Application raised error or warning with
 diagnostic text: "No manager for 7839".  SQLSTATE=UD030