1、异常概念

异常情况处理( EXCEPTION )是用来处理正常执行过程中未预料的事件 (错误),由于 PL/SQL 程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行。反之,则跳转至 最近的 EXCEPTION 进行处理

1.1 思维导图

Oracle 异常详解

1.2 语法格式

基本格式:
begin
    程序代码
exception 
    when XX异常  then
        处理异常
    when others then
       其他情况下的异常处理。
end;
!!!请注意:异常处理可以按任意次序排列,但 OTHERS 必须放在最后 !!!
-------------------------   举例说明   ------------------------
DECLARE
   v_num NUMBER(5) := 5;
BEGIN
   BEGIN
      v_num := v_num / 0;
   EXCEPTION       -- 如果此处无 exception,则抛向最近一个 exception
      WHEN OTHERS THEN
         dbms_output.put_line(SQLERRM || ' : ' || SQLCODE); 
         dbms_output.put_line(dbms_utility.format_call_stack);
         dbms_output.put_line(dbms_utility.format_error_backtrace);
   END;
EXCEPTION
   WHEN OTHERS THEN
      dbms_output.put_line(SQLERRM || ' : ' || SQLCODE);         -- 异常信息 及 编号
      dbms_output.put_line(dbms_utility.format_call_stack);      -- 异常堆栈
      dbms_output.put_line(dbms_utility.format_error_backtrace); -- 异常发生列
END;

2、异常类型及抛出

2.1 系统级

2.1.1 预定义异常

ORACLE 预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由 ORACLE 自动将其引发。如:‘违反了唯一性约束’

create table stu (
   id   number primary key,
   xm   nvarchar2
);
insert all
into(id, xm) values(1, '小游子');
into(id, xm) values(2, '小倩子');

-- 数据准备结束 --

DECLARE 

BEGIN
   EXECUTE IMMEDIATE 'INSERT INTO stu(ID, xm) VALUES(1, ''a'')';
EXCEPTION 
   WHEN OTHERS THEN 
      dbms_output.put_line(SQLERRM ||' : '||SQLCODE);
END;
输出:ORA-00001: 违反唯一约束条件 (SYSTEM.SYS_C0014451) : -1

2.2 用户级

程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后 显式抛出

2.2.1 raise

1、在 PL/SQL 块的定义部分定义异常情况:
      <异常情况 - 变量>   EXCEPTION;
2、RAISE <异常情况 - 变量>3、在 Exception 中对异常进行处理。

DECLARE 
   v_num NUMBER(5) := 5;
   exp1  EXCEPTION;
   exp2  EXCEPTION;
   
BEGIN
   IF v_num >= 0 THEN 
      RAISE exp1;
   END IF;
   
   IF v_num < 0 THEN 
      RAISE exp2;
   END IF;
   
EXCEPTION
   WHEN exp1 THEN
      dbms_output.put_line('v_num 为:'||v_num||' 大于0'); 
   WHEN exp2 THEN
      dbms_output.put_line('v_num 为:'||v_num||' 小于0'); 
   WHEN OTHERS THEN 
      dbms_output.put_line(SQLERRM ||' : '||SQLCODE);
END;

2.2.2 raise_application_error

调用 DBMS_STANDARD ( ORACLE 提供的包)包所定义的RAISE_APPLICATION_ERROR 过程,可以重新定义异常错误消息,它为应用程序提供了一种与 ORACLE 交互的方法。

raise_application_error(error_number, error_message, error_boolean);
error_number : 取值范围: -20000-20999 之间
error_message:相应的提示信息(< 2048 字节),超出则截取。
error_boolean : 可选项,若为 true: 则新错误将被添加到已经引发的错误列表中。  
                                        若为 false(默认):则覆盖。
DECLARE
   v_num NUMBER(5) := 5;
BEGIN
   BEGIN
      v_num := v_num / 0;
   EXCEPTION 
   WHEN OTHERS THEN 
      dbms_output.put_line(SQLERRM||' : '||SQLCODE);
      dbms_output.put_line(dbms_utility.format_error_backtrace);
      raise_application_error(-20000, '自定义错误:除数为 0 ', TRUE);
   END;
EXCEPTION 
   WHEN OTHERS THEN 
      dbms_output.put_line(SQLERRM||' : '||SQLCODE);
      dbms_output.put_line(dbms_utility.format_error_backtrace);
END;
输出结果:
ORA-01476: 除数为 0 : -1476
ORA-06512: 在 line 5

ORA-20000: 自定义错误:除数为 0
ORA-01476: 除数为 0 : -20000  -- false 则 无此项!
ORA-06512: 在 line 10

3、重写异常

系统预定义异常 + 用户自定义异常 皆可。

DECLARE 
   remaining EXCEPTION;  -- 1、异常声明
   PRAGMA EXCEPTION_INIT(remaining, -1); -- 2、异常初始化,此处的 ‘-1’ 就是 sqlcode
BEGIN
   EXECUTE IMMEDIATE 'INSERT INTO stu(ID, xm) VALUES(1, ''a'')';
EXCEPTION
   WHEN remaining THEN
      dbms_output.put_line('吾所行之事,不可你也!');  -- 重写
   WHEN OTHERS THEN 
      dbms_output.put_line(SQLERRM ||' : '||SQLCODE);
END;

相关文章:

  • 2021-07-15
  • 2021-08-24
  • 2021-05-28
  • 2021-08-03
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-01-07
  • 2021-11-20
  • 2021-10-17
  • 2021-09-10
  • 2022-01-24
相关资源
相似解决方案