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-01403 | 100 | 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;
相关文章推荐
- Oracle PL/SQL开发基础(第三十六弹:异常处理的一些经验)
- Oracle PL/SQL开发基础(第三十一弹:自定义异常)
- Oracle PL/SQL开发基础(第二十九弹:异常处理简介)
- Oracle Predefined PL/SQL Exceptions 预定义异常
- Oracle PL/SQL开发基础(第三十三弹:EXCEPTION_INIT)
- Oracle(PL/SQL编程基础(PL/SQL程序块与PL/SQL语句)、异常、游标、数据类型)
- Oracle PL/SQL开发基础(第十弹:子查询)
- Oracle PL/SQL开发基础(第二十五弹:操纵游标数据)
- Oracle PL/SQL开发基础(第五弹:视图)
- Oracle PL/SQL开发基础(第一弹:创建表和创建约束)
- Oracle PL/SQL开发基础(第十六弹:记录类型)
- Oracle(PL/SQL编程基础(PL/SQL程序块与PL/SQL语句)、异常、游标、数据类型)
- Oracle PL/SQL开发基础(第四弹:索引)
- Oracle PL/SQL开发基础(第二弹:使用数据字典视图查看表约束)
- Oracle PL/SQL开发基础(第二十六弹:游标变量)
- Oracle PL/SQL开发基础(第十五弹:同义词)
- 【Oracle】PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
- Oracle PL/SQL开发基础(第十一弹:表集合操作)
- Oracle PL/SQL开发基础(第三弹:修改表)
- Oracle PL/SQL开发基础(第二十二弹:类型转换函数)