利用 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