|
关键字: 分层查询 函数
触发器语法 Oracle物化视图 跟踪sql语句
本文详细介绍从零开始学Oracle—异常处理(八)
一、异常
(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物化视图 跟踪sql语句
本文详细介绍从零开始学Oracle—异常处理(八)
以上代码的问题是,只有条件满足 才会引发异常,否则永远都不会执行此句.
并且当有多个语句都有可能会引发此异常时,代码就过于冗余.并且都要显示
的引发异常,能不能让系统帮我们维护自定义异常了,当有异常引发时
自动
通知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;
关键字: 分层查询 函数
触发器语法 Oracle物化视图 跟踪sql语句
本文详细介绍从零开始学Oracle—异常处理(八)
常见系统异常参考表:
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-—约束(三)
从零开始学Oracle—内建函数(四)
从零开始学Oracle—内建对象(五)
从零开始学Oracle—性能对象(六)
从零开始学Oracle—PL/SQL(七)
|