Oracle异常

三种抛异常

1 预定义的异常处理

异常名称 异常码 描述
NO_DATA_FOUND ORA-01403 SELECT INTO 语句中没有返回任何记录
TOO_MANY_ROWS ORA-01422 SELECT INTO 语句中返回多于 1 条记录

异常号码,找对应的异常名字,判断抛出的异常名字,根据匹配的异常名处理;

declare
v_id varchar2(20);
begin
    select id into v_id from testCusor where id ='11';
    update testCusor set  id ='22' where id =v_id;
    exception 
       when NO_DATA_FOUND then 
       dbms_output.put_line('没有数据');
       when TOO_MANY_ROWS then
       dbms_output.put_line('多条数据');
       when others then
       dbms_output.put_line('其他错误');
end;

2 非预定义的异常处理
在declare中声明一个异常,使用pragma exception_init方法将异常和错误码进行绑定,然后对声明的异常进行处理;

declare
v_id varchar2(20);
--声明异常
myexception exception;
--将异常和错误码进行绑定
--非空约束异常码为-01400
pragma exception_init(myexception,-01400);
begin
   insert into testCusor values(null,'14');
   exception 
     --如果是声明的异常则
     when myexception then
     dbms_output.put_line('自定根据异常码定义的异常进行处理');
     when others then
     dbms_output.put_line('其他异常');
end;

3 用户自定义的异常处理
在declare中声明异常,然后在逻辑代码中使用RAISE 语句来抛出异常,在 EXCEPTION块中进行异常处理;

declare 
v_temp varchar2(20);
--定义一个异常
v_exception exception;
begin
 v_temp :='1';
   if v_temp ='1'   then
   --抛出用户自定义的异常
   raise v_exception;
  end if;
  exception 
  --对抛出的用户自定义的异常进行处理
   when v_exception then
   dbms_output.put_line('抛出异常');
   when others then
   dbms_output.put_line('其他异常');
end;

异常中使用SQLCODE, SQLERRM
在EXCEPTION中有这两个参数,SQLCODE是错误码,SQLERRM是错误信息,可以使用这两个参数进行记录日志;

declare
v_id varchar2(20);
--声明异常
myexception exception;
--将异常和错误码进行绑定
--非空约束异常码为-01400
pragma exception_init(myexception,-01400);
begin
   insert into testCusor values(null,'14');
   exception 
     --如果是声明的异常则
     when myexception then
     DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
     dbms_output.put_line('自定根据异常码定义的异常进行处理');
     when others then
     DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
     dbms_output.put_line('其他异常');
end;
--打印所有异常码对应的异常
CREATE TABLE errors (errnum NUMBER(4), errmsg VARCHAR2(100));
DECLARE
   err_msg  VARCHAR2(100);
BEGIN
   /*  得到所有 ORACLE 错误信息  */
   FOR err_num IN -100 .. 0 LOOP
      err_msg := SQLERRM(err_num);
      INSERT INTO errors VALUES(err_num, err_msg);
   END LOOP;
   commit;
END;
select * from errors;
发布了45 篇原创文章 · 获赞 0 · 访问量 912

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览