`
提烟而过
  • 浏览: 116368 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle学习(六)——15天Oracle入门

阅读更多

                          异常处理

--异常处理分为预定义异常处理,非预定义异常处理,和自定义异常处理。

<1>.预定义异常处理

 常见的Oracle已预定好的异常有:

 异常名称                     ORACLE错误             说明
   CURSOR_ALREADY_OPEN            ORA-6511          试图打开一个已打开的光标
   DUP_VAL_ON_INDEX               ORA-0001          试图破坏一个唯一性限制
   INVALID_CURSOR                 ORA-1001          试图使用一个无效的光标
   INVALID_NUMBER                 ORA-1722          试图对非数字值进行数字操作
   LOGIN_DENIED                   ORA-1017          无效的用户名或者口令
   NO_DATA_FOUND                  ORA-1403          查询未找到数据
   NOT_LOGGED_ON                  ORA-1012          还未连接就试图数据库操作
   PROGRAM_ERROR                  ORA-6501          内部错误
   ROWTYPE_MISMATCH               ORA-6504          主变量和光标的类型不兼容
   STORAGE_ERROR                  ORA-6500          内部错误
   TIMEOUT_ON_RESOURCE            ORA-0051          发生超时
   TOO_MANY_ROWS                  ORA-1422          SELECT INTD命令返回的多行
   TRANSACTION_BACKED_OUT         ORA-006           由于死锁提交被退回
   VALUE_ERROR                    ORA-6502          转换或者裁剪错误
   ZERO_DIVIDE                    ORA-1476          试图被零除

 --eg:

   declare

   va number;

   begin

   va:=6;

   dbms_output.put_line(va/0);

   exception

   when zero_divide then  --zero_divide oracle内已经定义好的异常 可直接用.

   dbms_output.put_line('被零整除了!');

   end;

  

<2>.非预定义的异常处理

 

  alter table emp modify --修改表emp使其empno不能为空

  (empno  not null);

 

  declare

  e_nullin exception; --自定义一个异常变量

  pragma exception_init(e_nullin ,-01400);--将异常变量与标准oracle联系起来

  begin

  insert into emp values(null,'huam','kasdk',null,null,3000,600,10);

  exception

  when e_nullin then --利用异常 变量对其进行异常处理

  dbms_output.put_line('你插入的empno值不能为空!');

  end;

  ***预定义异常处理与非预定义异常处理的主要不同点在于 预定义异常中oracle既定义了错误信息

  又定义了错误名称,而预定义异常处理中oracle只定义了错误信息,而没有定义错误名称,在使用

  中还须要我们自已定义错误名称后再与错误信息相连之后才能使用。

 

<3>.自定义的异常处理

 

drop table emp--删除以前使用后的emp

create table emp as select * from SCOTT.emp --emp

 

 alter table emp

 add constraint emp_ck check(sal>500 and sal <10000); --修改emp表使其sal500--10000之间

 

 declare

 e_myexecption exception;--定义一个异常 变量

 pragma exception_init(e_myexecption,-8888);--与自已定义的错误信息连接起来(这里的错误信息是oracal内不存在的)

 aa number:=&sal;--从键盘接收数据

 begin

 if aa>10000 or aa<500 then

 raise e_myexecption;--自定义异常必须要显示的抛出异常

 else

 update emp set sal=aa where empno =7788;

 end if;

 exception --当输入的不在500-10000之间时会异常处理

 when e_myexecption then

 dbms_output.put_line('你输入的工资超出500-10000之间!');

 end;

 

<4>异常函数

 oracle出现异常时我们可以通过sqlcode来取的oracle的错误号,

 利用sqlerrm可以取的错误文本信息 这两个函数在任何异常中都可

 以用,但一般都用在others句子,others子句是异常处理的最后一

 个重要环节。

 --如在上题中当用户输入的不是number类型时若无others句子则要出现异常.修改如下

declare

  va emp.ename%type;

begin

  select ename into va from emp where sal = &aa;

  dbms_output.put_line('雇员名' || va);

exception

  when no_data_found then

    dbms_output.put_line('没有找到数据');

  when others then

    dbms_output.put_line('sqlcode:' || sqlcode || ' sqlerrm' || sqlerrm);

end;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics