暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 异常处理和内置异常

自学Oracle 2019-03-05
1959

1、异常处理

<<exception_01>>

DECLARE

   v_n1       INTEGER := &v_n1;

   v_n2       INTEGER := &v_n2;

   v_result   NUMBER;

BEGIN

   v_result := v_n1 v_n2;

   DBMS_OUTPUT.put_line ('v_result:' || v_result);

EXCEPTION

   WHEN ZERO_DIVIDE

   THEN

      DBMS_OUTPUT.put_line ('除数为0');

END exception_01;

2、内置异常

--no_data_found:当没有调用分组函数(例如sum 或者count等)时select into语句没有任何数据行,此时就会抛出这个异常。

--too_many_rows:当select into语句返回多个数据行时,就会抛出这个异常。

--zero_divide:当程序中除法运算的除数是0时,就会抛出这个异常。

--login_denied:当用户尝试使用无效的用户名或者密码登陆oracle时,就会抛出这个异常。

--program_error:当PL/SQL程序存在某个内部问题时,就会抛出这个异常。

--value_error:当出现转换或者大小匹配错误时,会抛出这个异常。

--dup_value_on_index:当程序尝试在定义唯一性索引的数据列中保持重复值时,会抛出这种异常。

3、自定义异常

/*自定义异常*/

<<exception_02>>

DECLARE

   e_name   EXCEPTION;

BEGIN

    raise e_name;

EXCEPTION

   WHEN e_name 

   THEN

      DBMS_OUTPUT.put_line ('name error');

END exception_02;

4、异常传播

当PL/SQL语句块的声明部分出现运行时错误时,该语句块的异常处理部分不能捕获此错误。

当内部语句块的声明部分发生运行时错误时,该异常会立即传播到外部语句块。

当PL/SQL语句块的异常处理部分发生运行时错误时,该语句块的异常处理部分不能防止这个错误。

当内部语句块的异常处理部分发生运行时错误时,该异常会立即传播到外部语句块。


/* 再次抛出异常 */

DECLARE

   e_excep   EXCEPTION;

BEGIN

   --inner block

   BEGIN

      RAISE e_excep;

   EXCEPTION

      WHEN e_excep

      THEN

         RAISE e_excep;

   END;

EXCEPTION

   WHEN e_excep

   THEN

      DBMS_OUTPUT.put_line ('error');

END;

5、异常:高级概念

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_message是错误文本,最多包含2048个字符。

--keep_errors是可选的boolean参数,如果设置为ture,新错误会被添加到已经抛出的错误列表中。这种错误列表被称为错误栈。如果keep_errors被设置为false,新错误会替换已经抛出的错误栈。keep_errors参数默认值是flase。

DECLARE

   v_id   test01.id%TYPE := &v_id;

BEGIN

   IF v_id > 6

   THEN

      raise_application_error (-20001, 'error');

   END IF;

END;

6、exception_init编译指令

declare

exception_name exception;

pragma exception_init(exception_name,error_code);

用户定义异常的声明出现在所使用的exception_init编译指令之前。

exception_name 是异常的名称,

error_code是希望与该异常建立关联的oracle错误编号。


DECLARE

   v_id      test01.id%TYPE := &v_id;

   e_excep   EXCEPTION;

   PRAGMA EXCEPTION_INIT (e_excep, -20222);

BEGIN

       IF v_id > 6

   THEN

      raise_application_error (-20222, 'error');

   END IF;

EXCEPTION

   WHEN e_excep

   THEN

      DBMS_OUTPUT.put_line ('oracle -20222,error');

END;


7、sqlcode 和 sqlerrm

用于实现others异常处理程序。

sqlcode函数返回oracle错误编号。

sqlerrm函数返回错误消息。最大长度512字节。


DECLARE

   v_id     test01.id%TYPE := &v_id;

   v_name   test01.name%TYPE;

   e_code   NUMBER;

   e_msg    VARCHAR2 (200);

BEGIN

   SELECT name   INTO v_name  FROM test01 WHERE id = v_id;

EXCEPTION

   WHEN OTHERS

   THEN

      e_code := SQLCODE;

      e_msg := SUBSTR (SQLERRM, 1, 200);

      DBMS_OUTPUT.put_line ('code ' || e_code || '  msg ' || e_msg);

END;


本公众号是个人学习工作笔记,希望大家发现问题能及时和我本人沟通,希望你与我共同成长。个人微信zgjt12306。



 

欢迎关注“自学Oracle”





文章转载自自学Oracle,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论