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

来源:互联网 发布:如何在淘宝上搜索店铺 编辑:程序博客网 时间:2024/06/04 18:16

无论是预定义错误还是自定义错误,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;                            --定义员工查询条件变量   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; 
阅读全文
1 0
原创粉丝点击