Oracle:pl/sql 异常处理

来源:互联网 发布:咖啡机 怎么做 知乎 编辑:程序博客网 时间:2024/05/17 23:31

Oracle:pl/sql 异常处理
生成错误
 
处理 oracle 系统自动生成系统异常外,可以使用 raise 来手动生成错误。
l         Raise exception;
l         Raise package.exception;
l         Raise;
以上是 raise 的三种使用方法。第一种用于生成当前程序中定义的异常或在 standard 中的系统异常。
       Declare
              Invalid_id exception;
              Id_values varchar(2);
       Begin
              Id_value:=id_for(‘smith’);
              If substr(id_value,1,1)!=’x’
              Then
                     Raise invalid_id;
              End if;
       Exception
              When invalid_id
              Then
                     Dbms_output.put_line(‘this is an invalid id!’);
       End;
这是一个生成自定义异常的例子,当然也可以生成系统异常:
       declare
              employee_id_in number;
       Begin
Select employee_id into employee_id_in from employ_list where employee_name=&n;
If employee_id_in=0
Then
       Raise zero_devided;
End if;
       Exception
              When zero_devided
              Then
                     Dbms_output.put_line(‘wrong!’);
       End;
有一些异常是定义在非标准包中的,如 UTL_FILE , DBMS_SQL 以及程序员创建的包中异常。可以使用 raise 的第二种用法来生成异常。
       If day_overdue(isbn_in, browser_in) > 365
       Then
              Raise overdue_pkg.book_is_lost
       End if;
在最后一种 raise 的形式中,不带任何参数。这种情况只出现在希望将当前的异常传到外部程序时。
       Exception
              When no_data_found
              Then
                     Raise;
       End;
 
Pl.sql 使用 raise_application_error 过程来生成一个有具体描述的异常。当使用这个过程时,当前程序被中止,输入输出参数被置为原先的值,但任何 DML 对数据库所做的改动将被保留,可以在之后用 rollback 命令回滚。下面是该过程的原型:
       Procedure raise_application_error(
       Num binary_integer;
       Msg varchar2;
       Keeperrorstack Boolean default false
)
其中 num 是在 -20999 到 -20000 之间的任何数字(但事实上, DBMS_OUPUT 和 DBMS_DESCRIBLE 包使用了 -20005 到 -20000 的数字); msg 是小于 2K 个字符的描述语,任何大于 2K 的字符都将被自动丢弃; keeperrorstack 默认为 false ,是指清空异常栈,再将当前异常入栈,如果指定 true 的话就直接将当前异常压入栈中。
    CREATE OR REPLACE PROCEDURE raise_by_language (code_in IN PLS_INTEGER)
    IS
       l_message error_table.error_string%TYPE;
    BEGIN
       SELECT error_string
         INTO l_message
         FROM error_table, v$nls_parameters v
        WHERE error_number = code_in
          AND string_language = v.VALUE
          AND v.parameter = 'NLS_LANGUAGE';
 
       RAISE_APPLICATION_ERROR (code_in, l_message);
    END;

 

原创粉丝点击