五、错误处理

文章目录

  • 一、处理错误
  • 二、内置异常
  • 三、用户自定义异常
  • 四、RAISE_APPLICATION_ERROR
  • 五、SQLCODE和SQLERRM


一、处理错误

PL/SQL程序可能存在两种类型错误:编译错误和运行时错误。PL/SQL语句块中的异常处理部分会处理运行时的错误。运行时错误被称为异常。在异常处理部分,可以指定当特定异常发生时,会采取什么动作。

PL/SQL有两种类型异常:内置异常和用户自定义异常。

DECLARE
    v_num1 NUMBER := &num1;
    v_num2 NUMBER := &num2;
    v_result NUMBER;
BEGIN
    v_result := v_num1 / v_num2;
    DBMS_OUTPUT.PUT_LINE(v_result);
EXCEPTION
    WHEN ZERO_DIVIDE THEN
        DBMS_OUTPUT.PUT_LINE('被除数不能为零');
END;

使用异常处理,可以使用程序能够正常结束,而不是非正常终止。

二、内置异常

如果程序违反了某个oracle规则,就会执行语句块的异常处理部分。这时候,会执行错误处理语句。要知道,在执行完语句块的异常处理部分之后,该语句块就会终止执行,这一点非常重要。
ORACLE常用内置异常就不一一列举出来了,自行百度吧。

三、用户自定义异常

内置异常是隐式抛出的,用户定义异常必须显式抛出。

DECLARE
    v_num1 NUMBER := &num1;
    v_num2 NUMBER := &num2;
    v_result NUMBER;
    -- 定义一个异常变量,以e开头,但这不是必须的。
    e_errvalue EXCEPTION;
BEGIN
    IF v_num2 = 0 THEN
        RAISE e_errvalue;
    END IF;
    v_result := v_num1 / v_num2;
    DBMS_OUTPUT.PUT_LINE(v_result);
EXCEPTION
    WHEN e_errvalue THEN
        DBMS_OUTPUT.PUT_LINE('被除数不能为零!'); 
END;

四、RAISE_APPLICATION_ERROR

RAISE_APPLICATION_ERROR是Oracle提供的一种特殊的内置过程,允许程序员为特定应用程序创建有意义的错误消息。RAISE_APPLICATION_ERROR过程适用于用户定义异常。它的语法为:
RAISE_APPLICATION_ERROR(error_number, error_message);
或者
RAISE_APPLICATION_ERROR(error_number, error_message, keep_errors);

参数说明:

  • error_number:是与特定错误消息相关联的错误编号,这个编号范围在-20999-20000之间。
  • error_mesage:是错误文本,最多包含2048个字符。
  • keep_errors:这是可选的Boolean参数。如果被 设置TRUE,新错误会被添加到已经抛出的错误列表中。这种错误列表被称为错误栈。如果设置为FALSE,新错误会替换已经被抛出的错误栈。默认值是FALSE。

RAISE_APPLICATION_ERROR过程适用于未命名的用户定义异常。

DECLARE
    v_num1 NUMBER := &num1;
    v_num2 NUMBER := &num2;
    v_result NUMBER;
BEGIN
    IF v_num2 = 0 THEN
        RAISE_APPLICATION_ERROR(-20000,'被除数不能为零!');
    ELSE
        v_result := v_num1 / v_num2;
        DBMS_OUTPUT.PUT_LINE(v_result);
    END IF;
END;

如上事例运行之后结果如下图:
五、错误处理_第1张图片

五、SQLCODE和SQLERRM

所有Oracle错误都可以使用OTHERS异常处理程序进行捕获和处理。

DECLARE
   ......
BEGIN
   ......
EXCEPTION
    WHEN OTHERS THEN
        ......
END;

你无法知道程序执行时所有可能发生的运行时错误,因此最好在自己的脚本中添加OTHERS异常处理程序。ORACLE提供了两个内置函数-SQLCODE和SQLERRM用于实现OTHERS异常处理程序。SQLCODE函数会返回ORACLE错误编号,SQLERRM函数返回错误消息,最大长度是512字节。

DECLARE
    v_num1 NUMBER := &num1;
    v_num2 NUMBER := &num2;
    v_result NUMBER;
    v_errcode NUMBER;
    v_errmsg VARCHAR2(512);
BEGIN
    v_result := v_num1 / v_num2;
    DBMS_OUTPUT.PUT_LINE(v_result);
EXCEPTION
    WHEN OTHERS THEN
        v_errcode := SQLCODE;
        v_errmsg := SQLERRM;
        DBMS_OUTPUT.PUT_LINE(v_errcode||':'||v_errmsg);
END;

上例中num2赋值零输出的结果是:
-1476:ORA-01476: divisor is equal to zero

你可能感兴趣的:(Oracle,PL/SQL教程,PL/SQL,ORACLE,数据库开发)