异常处理
异常是oracle数据库中的PL/SQL代码执行期间出现的错误。无论任何时候,当PL/SQL引擎执行代码时,都可能语带异常。当产生异常时,PL/SQL会将程序控制转到程序块的异常部分。
如果在程序块中没有异常处理,那么异常就会传播,或者发往程序块调用者。例如,如果用户创建的程序块中没有异常处理部分,那么任何异常都会被发送到SQL*Plus中,SQL*Plus处理异常的方法就是在屏幕上显示异常信息。
Oracle有3中类型的异常:
预定义异常:
Oracle为用户提供了大量的在PL/SQL中使用的预定义异常,已以检查用户代码失败的一般原因,他们都定义在Oracle的核心PL/SQL库中,用户可以在自己的PL/SQL异常处理部分使用名称对其进行标识。对这种异常情况的处理,无需再程序中定义,由Oracle自动将其引发。
非预定义异常:
即其他标准的Oracle错误。对这种异常情况的处理,需要用户在程序中定义,然后由oracle 自动将其引发。
自定义异常 :
如果程序设计人员认为某种情况违反了业务逻辑,则设计人员可明确定义并引发异常。
异常处理部分一般放在PL/SQL程序的后半部分,其结构如下:
EXCEPTION
WHEN first_exception THEN <code to handle first exception>
WHEN second_exception THEN <code to handle second exception>
WHEN OTHERS THEN<code to handle others exception>
END;
Oracle预定义的异常
信息 | 异常名称 | 说明 |
ORA-0001 | DUP-VAL-ON-INDEX | 试图破坏一个唯一性的限制 |
ORA-0051 | Timeout-on-resource | 在等待资源时发生超时 |
ORA-0061 | Transaction-backed-out | 由于发生死锁,事务被撤销 |
ORA-1001 | Invalid_CURSOR | 试图使用一个无效的游标 |
ORA-1012 | Not-logged-on | 没有连接到oracle |
ORA-1017 | Login-denied | 无效的用户名口令 |
ORA-1403 | NO-DATA-FOUND | SELECT INTO没有找到数据 |
ORA-1422 | TOO_MANY_ROWS | SELECT INTO返回多行 |
ORA-1476 | Zero-divide | 试图被零除 |
ORA-1722 | Invalid-NUMBER | 转换一个数字失败 |
ORA-6500 | Storage-error | 内存不够引发的内部错误 |
ORA-6501 | Program-error | 内部错误 |
ORA-6502 | Value-error | 转换或截断错误 |
ORA-6504 | Rowtype-mismatch | 主变量和游标类型不兼容 |
ORA-6511 | CURSOR-ALERADY-OPEN | 试图打开一个已经打开的游标时,将产生这样的错误 |
ORA-6530 | Access-INTO-null | 试图为null对象属性赋值 |