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;