oracle 异常处理(转载)
来源:互联网 发布:mysql insert字段 编辑:程序博客网 时间:2024/05/23 10:33
一、异常
(1) 程序错误
- 编译时
- 运行时
(2)异常
- 处理运行时错误
.PL/SQL是如何处理异常的?
- 错误引发异常
- 每当引发异常时,都将控制权传递给异常处理程序
- 异常处理程序处理异常
.异常中涉及的步骤
- 声明异常
- 引发异常
- 处理异常
.异常的类型
- 预定义的异常 --由Oracle服务器维护异常
- 非预定义的异常 又称'用户定义异常'
1、预定义异常
由Oracle为常见错误预定义
在DBMS_Standard程序包中提供了这些定义
不需要显式声明
declare
empJob emp.job%type;
begin
select job into empjob from emp where empno=0000;
DBMS_output.put_line('Employee job is '||emjob);
Exception
when No_data_found then
DBMS_output.put_line('错误了,查询没有返回行');
when too_many_rows then
DBMS_output.put_line('错误了,查询返回了多条数据');
when zero_divide then
DBMS_output.put_line('错误了,除数不能为零');
when others then --一定是最后一个处理的代码
DBMS_output.put_line('错误了,未知的错误信息');
end;
2、非预定义异常
无法预知的错误,如网络不通、服务没有启动、或其他错误,这样的异常需要用户要定义
declare
PK_conflict Exception; --用户定义异常
iCount int:=0;
begin
select count(*) into iCount from emp where empno='7369'
if iCount>0 then
raise Dup_Value; --引发异常
end if;
Exception
when PK_conflict then --处理异常
DBMS_output.put_line('表中已经有这条记录了');
end;
/
以上代码的问题是,只有条件满足 才会引发异常,否则永远都不会执行此句.
并且当有多个语句都有可能会引发此异常时,代码就过于冗余.并且都要显示
的引发异常,能不能让系统帮我们维护自定义异常了,当有异常引发时 自动
通知Oracle服务器处理异常
pragma指令
declare
PK_conflict Exception; --用户定义异常
pragma Exception_init(PK_conflict -1); --编译指令 可以把异常捆绑到Oracle 并覆盖预定义的异常
iCount int:=0; 这里的-1 代表主键冲突
begin
insert into emp(empno,ename) values('7369','FeiYang');
Exception
when PK_conflict then --处理异常
DBMS_output.put_line('表中已经有这条记录了,主键冲突');
end;
为了给用户友好的错误提示.用此函数可以定义友好的提示。
DBMS_output.put_line()函数只有sqlPlus 客户端支持.
Raise_Application_Error
.用于创建用户定义的错误消息的过程
.可以再执行部分和异常部分使用
.必须介于 -20000 和 -20999之间
.可以存储2M的错误信息
declare
PK_conflict Exception; --用户定义异常
pragma Exception_init(PK_conflict -1); --编译指令
iCount int:=0;
begin
insert into emp(empno,ename) values('7369','FeiYang');
Exception
when PK_conflict then --处理异常
Raise_Application_Error(-20001,'表中已经有这条记录了'); --注意参数的前后顺序
end;
常见系统异常参考表:
1命名的系统异常 产生原因
2 access_into_null 未定义对象
3 CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时
4 COLLECTION_IS_NULL 集合元素未初始化
5 CURSER_ALREADY_OPEN 游标已经打开
6 DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值
7 INVALID_CURSOR 在不合法的游标上进行操作
8 INVALID_NUMBER 内嵌的 SQL 语句不能将字符转换为数字
9 NO_DATA_FOUND 使用 select into 未返回行,或应用索引表未初始化的元素时
10 TOO_MANY_ROWS 执行 select into 时,结果集超过一行
11 ZERO_DIVIDE 除数为 0
12 SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或 VARRAY 的最大值
13 SUBSCRIPT_OUTSIDE_LIMIT 使用嵌套表或 VARRAY 时,将下标指定为负数
14 VALUE_ERROR 赋值时,变量长度不足以容纳实际数据
15 LOGIN_DENIED 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码
16 NOT_LOGGED_ON PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据
17 PROGRAM_ERROR PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包
18 ROWTYPE_MISMATCH 宿主游标变量与 PL/SQL 游标变量的返回类型不兼容
19 SELF_IS_NULL 使用对象类型时,在 null 对象上调用对象方法
20 STORAGE_ERROR 运行 PL/SQL 时,超出内存空间
21 SYS_INVALID_ID 无效的 ROWID 字符串
22 TIMEOUT_ON_RESOURCE Oracle 在等待资源时超时
23
24
- oracle 异常处理(转载)
- oracle 中 的异常处理(转载)
- 转载:学习笔记:oracle异常处理
- 【转载】Struts2异常处理
- 【转载】struts2异常处理
- PHP 异常处理(转载)
- 转载:异常处理最佳实践
- c++异常处理(转载)
- Java异常处理机制【转载】
- Java异常处理机制【转载】
- Java异常处理机制【转载】
- Java异常处理机制【转载】
- Java异常处理机制【转载】
- 【转载】Struts2中的异常处理
- Java异常处理机制【转载】
- Java异常处理机制【转载】
- Java异常处理机制【转载】
- oracle数据异常处理
- 流媒体相关
- 网络带宽与下载速度的误解
- sun的没落是悲还是喜?
- ARM系统基本文件格式
- Xml TreeView
- oracle 异常处理(转载)
- 分享一个自己写的httpWatch自动化测试工具
- JTAG 详解
- 深入剖析C#的多态
- Linux挂载网络共享文件夹
- VS2005(c#)项目调试问题解决方案集锦
- SSH,telnet终端中文显示乱码解决办法
- SUN被收购了。。。Unix——Center立马就发邮件。。。
- 文件下载方法