您的位置:首页 > 数据库 > Oracle

Oracle PL/SQL开发基础(第三十弹:预定义异常)

2017-08-09 22:30 513 查看
无论是预定义错误还是自定义错误,Oracle在内部都会隐含地触发一个错误,每个错误都有一个序号,SQLCODE就是异常的编码,SQLERRM用来获取异常的信息。但是在PL/SQL进行异常处理时,不能直接使用异常编码,必须使用一个名字来引用和处理异常。因此PL/SQL为一些公共的错误定义了一系列的预定义异常。

常见的预定义异常如下:

Oracle错误号SQLCODE值异常名称异常描述
ORA-00001-1
DUP_CAL_ON_INDEX
唯一索引对应的列上有重复值
ORA-00051-51
TIMEOUT_ON_RESOURCE
Oracle在等待资源时超时
ORA-01001-1001
INVALID_CURSOR
在不合法的游标上进行操作
ORA-01012-1012
NOT_LOGGED_ON
PL/SQL应用程序在没有连接Oracle数据库的情况下访问数据
ORA-01017-1017
LOGIN_DENIED
PL/SQL应用程序连接Oracle数据库时提供了不正确的用户名或密码
ORA-01403100
NO_DATA_FOUND
SELECT INTO语句没有返回数据,或者我们的程序引用了一个嵌套表中被删除了的元素或索引表中未初始化的元素。SQL聚合函数,如AVG和SUM,总是能返回一个值或空。所以,一个调用聚合函数的SELECT INTO语句从来不会抛出
NO_DATA_FOUND
异常。FETCH语句最终会取不到数据,当这种情况发生时,不会有异常抛出。
ORA-01410-1410
SYS_INVALID_ROWID
从字符串向ROWID转换发生错误,因为字符串并不代表一个有效的ROWID
ORA-01422-1422
TOO_MANY_ROWS
执行SELECT INTO时,结果集超过一行
ORA-01476-1476
ZERO_DIVIDE
程序尝试除以0
ORA-01722-1722
INVALID_NUMBER
在一个SQL语句中,由于字符串并不代表一个有效的数字,导致字符串向数字转换时会发生错误。当FETCH语句的LIMIT子句表达式后面不是一个正数时,这个异常也会被抛出。
ORA-06500-6500
STORAGE_ERROR
PL/SQL运行时内存溢出或内存不足
ORA-06501-6501
PROGRAM_ERROR
PL/SQL程序发生内部错误
ORA-06502-6502
VALUE_ERROR
赋值时,变量长度不足以容纳实际数据。
ORA-06504-6504
ROWTYPE_MISMATCH
赋值语句中使用的主游标变量和PL/SQL游标变量的类型不兼容。
ORA-06511-6511
CURSOR_ALREADY_OPEN
程序尝试打开一个已经打开的游标。一个游标在重新打开之前必须关闭。
ORA-06530-6530
ACCESS_INTO_NULL
尝试向一个为NULL的对象的属性赋值
ORA-06531-6531
COLLECTION_IS_NULL
程序尝试调用一个未初始化嵌套表或变长数组的集合方法(不包括EXISTS),或者是程序尝试为一个未初始化嵌套表或变长数组的元素赋值
ORA-06532-6532
SUBSCRIPT_OUTSIDE_LIMIT
程序引用一个嵌套表或变长数组,但使用的下标索引不在合法的范围内。
ORA-06533-6533
SUBSCRIPT_BEYOND_COUNT
程序引用一个嵌套表或变长数组元素,但使用的下标索引超过嵌套表或变长数组元素总个数
ORA-06592-6592
CASE_NOT_FOUND
CASE语句中没有任何WHEN子句满足条件,并且没有编写ELSE子句
使用预定义异常如:

DECLARE
v_empno1 NUMBER(4):=&empno1;
b325
--定义员工查询条件变量
v_empno2 NUMBER(4):=&empno2;
v_empno3 NUMBER(4):=&empno3;
v_sal1 NUMBER(10,2);                                    --定义保存员工薪资的变量
v_sal2 NUMBER(10,2);
v_sal3 NUMBER(10,2);
v_selectcounter NUMBER := 1;                            --查询计数器变量
BEGIN
SELECT sal INTO v_sal1 FROM emp WHERE empno=v_empno1;  --查询员工薪资信息
v_selectcounter:=2;
SELECT sal INTO v_sal2 FROM emp WHERE empno=v_empno2;
v_selectcounter:=3;
SELECT sal INTO v_sal3 FROM emp WHERE empno=v_empno3;
EXCEPTION
WHEN NO_DATA_FOUND THEN                                 --处理未找到数据的异常
DBMS_OUTPUT.PUT_LINE('错误编号:'||SQLCODE||' 错误消息:'||SQLERRM
||' 触发异常的位置是:'||v_selectcounter);
END;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: