RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)


    RAISE_APPLICATION_ERROR :
    **
    从存储过程子程序中抛出自定义的错误消息。

    1. RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors]);

    里面的错误代码和内容,都是自定义的。说明是自定义,当然就不是系统中已经命名存在的错误类别,是属于一种自定义事务错误类型,才调用此函数。

    • error_number 从 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突。
    • error_msg 的长度不能超过 2k,否则截取 2k。
    • keep_errors是一个可选的布尔值,True表示新的错误将被添加到已经抛出的错误列表中,False表示新的错误将替换当前的错误列表,默认为False。

    RAISE_APPLICATION_ERROR只能在存储的子程序中调用。当被调用时,将结束当前的子程序并返回一个用户自定义的错误代码和错误消息给应用程序,这些错误代码和错误消息可以像任何的Oracle错误一样被捕获。

    举例:

    CREATE OR REPLACE TRIGGER CHANGE_TEACHER
      BEFORE INSERT OR UPDATE OR DELETE ON TEACHERS
    BEGIN
      IF (TO_CHAR(SYSDATE, 'HH24') NOT BETWEEN '8' AND '17') OR
         (TO_CHAR(SYSDATE, 'DY', 'nls date_langudage = american') IN
         ('SAT', 'SUN')) THEN
        CASE
          WHEN INSERTING THEN
            RAISE_APPLICATION_ERROR(-20001, '在非工作时间不能增加教师信息。');
          WHEN UPDATING THEN
            RAISE_APPLICATION_ERROR(-20002, '在非工作时间不能修改教师信息。');
          WHEN DELETING THEN
            RAISE_APPLICATION_ERROR(-20003, '在非工作时间不能删除教师信息。');
        END CASE;
      END IF;
    END CHANGE_TEACHER;
    DELETE FROM TEACHERS;