PL/SQL程序在运行的过程当中,可能会出现错误或者异常的情况,例如无法建立与ORACLE的连接,或者返回多行的错误。好的程序应该是对可能发生的异常情况进行处理,异常处理代码在EXCEPTION中实现。可以在EXCEPTION块中使用WHEN语句来定义异常处理。WHEN语句的使用方法如下:
EXCEPTION
WHEN <异常情况名> THEN
<异常处理代码>
WHEN <异常情况名> THEN
<异常处理代码>
……
WHEN OTHERS THEN
<异常处理代码>
异常情况名是ORACLE定义的异常情况标识,当WHEN语句中指定的异常情况发生的时候,THEN关键字后面的异常处理代码将会被执行:
异常情况名 |
ORA代码 |
SQL代码 |
说明 |
ACCESS_INTO_NULL |
ORA-06530 |
-6530 |
试图赋值到一个未初始化的对象 |
COLLECTION_IS_NULL |
ORA-06531 |
-6531 |
试图使用未初始化的嵌入表或者变长数组 |
CURSOR_ALREADY_OPEN |
ORA-06511 |
-6511 |
试图打开一个已经打开的游标 |
DUP_VAL_ON_INDEX |
ORA-00001 |
-1 |
试图向一个表中插入数据,但该行数据不符合索引约束 |
INVALID_CURSOR |
ORA-01001 |
-1001 |
试图进行游标操作,但是却不能打开游标 |
INVALID_NUMBER |
ORA-01722 |
-1722 |
字符向数字的转换失败 |
LOGIN_DENIED |
ORA-01017 |
-1017 |
试图和ORACLE建立连接,但是却不能提供有效的用户名和口令 |
NO_DATA_FOUND |
ORA-01403 |
100 |
执行了SELECT INTO语句,但是却没有匹配的行数据 |
NOT_LOGGED_ON |
ORA-01012 |
-1012 |
试图进行数据库操作,但没登陆 |
PROGRAM_ERROR |
ORA-06501 |
-6501 |
PL/SQL内部错误 |
ROWTYPE_MISMATCH |
ORA-06504 |
-6504 |
PL/SQL返回的游标变量和主游标不匹配 |
SELF_IS_NULL |
ORA-30625 |
-30625 |
试图执行对象例程的一个成员方法,但全程为空(NULL) |
STORAGE_ERROR |
ORA-06500 |
-6500 |
存储空间错误 |
SUBSCRIPT_BEYOND_COUNT |
ORA-06532 |
-6532 |
试图通过使用索引来引入嵌入表,但是此索引比表中的数值还要大 |
SYS_INVALID_ROWID |
ORA-01410 |
-1410 |
试图将一个字符串传递给ROWID,但是操作失败 |
TIMEOUT_ON_RESOURCE |
ORA-00051 |
-51 |
当Oracle等待分配资源的时候,资源已经耗尽 |
TOO_MANY_ROWS |
ORA-01422 |
-1422 |
执行一条SELECT INTO语句,但是却返回了多行数据 |
VALUE_ERROR |
ORA-06502 |
-6502 |
当试图将一个值存储到一个变量时,此变量不接受这个值。可能是由于该值太大了或者与变量的类型不匹配 |
ZERO_DIVIDE |
ORA-01476 |
-1476 |
试图用0做除数 |
以下是一个控制异常的示例程序:
DECLARE
var_name VARCHAR2(100);
BEGIN
SELECT aac003
INTO var_name
FROM ac01、、
WHERE aac002='xxxx';
EXCEPTION
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('返回多条数据');
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('没有找到数据');
WHEN OTHERS THEN
dbms_output.put_line('执行有误'||SQLERRM);
END;