- 浏览: 74887 次
文章分类
ORACLE异常包括预定义异常,非预定义异常,自定义异常。
1、预定义异常
即oracle已定义的异常,无需在程序中定义,由ORACLE自动将其引发,可以直接使用定义的异常名称捕获。ORACLE预定义的异常情况大约有24个,如下。
错误号 异常错误信息名称 异常产生原因
ORA-0001 dup_val_on_index 违反了唯一性限制
ORA-0051 timeout_on_resource 在等待资源时发生超时
ORA-0061 transaction_backed_out 由于发生死锁事务被撤消
ORA-1001 invalid_cursor 试图使用一个无效的游标
ORA-1012 not_logged_on 没有连接到ORACLE
ORA-1017 login_denied 无效的用户名/口令
ORA-1403 no_data_found SELECT INTO没有找到数据
ORA-1410 sys_invalid_id 无效的 rowid 字符串
ORA-1422 too_many_rows SELECT INTO 返回多行
ORA-1476 zero_divide 除数为 0
ORA-1722 invalid_number 转换一个数字失败
ORA-6500 storage_error 内存不够引发的内部错误
ORA-6501 program_error 内部错误
ORA-6502 value_error 转换或截断错误(赋值时,变量长度不足以容纳实际数据)
ORA-6504 rowtype_mismatch 主游标变量与 PL/SQL变量有不兼容行类型
ORA-6511 curser_already_open 试图打开一个已处于打开状态的游标
ORA-6530 access_into_null 试图为null 对象的属性赋值
ORA-6531 collection_is_null 集合元素未初始化
ORA-6532 subscript_outside_limit 对嵌套或varray索引得引用超出声明范围以外
ORA-6533 subscript_beyond_count 对嵌套或varray 索引得引用大于集合中元素的个数.
ORA-6592 case_not_found case中若未包含相应的when,并且没有设置.
self_is_null 使用对象类型时,在 null 对象上调用对象方法
预定义异常可以通过异常名捕获处理,示例如下(所有示例以PLSQL执行):
PLSQL执行结果为:
2、非预定义异常
即其他标准的ORACLE错误,但是oracle并没有对其进行定义。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。
创建测试表
插入测试数据
测试代码
3、自定义异常
需要根据实际情况自己定义错误消息,RAISE_APPLICATION_ERROR用于自定义错误消息,并且消息号必须在-20000~-20999之间,以便与oracle定义的错误区分开。用户定义的异常错误可以通过显式使用RAISE语句来触发,也可以通过RAISE_APPLICATION_ERROR定义。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
RAISE触发异常:
RAISE_APPLICATION_ERROR定义异常
RAISE_APPLICATION_ERROR由oracle的DBMS_STANDARD包提供,语法如下:
error_number 是从 –20,000 到 –20,999 之间的参数,
error_message 是相应的提示信息(< 2048 字节),
keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。
示例:
4、总结
EXCEPTION必须放在begin/end代码块中:如上面的示例,inner1的代码块中包含exception,捕获到invalid_deptno异常并处理后继续执行,get_salary(20)正常执行,inner2代码块中并没有exception捕获异常,故此代码块终止,调到其父代码块,异常被最后的exception捕获,inner2到最后的exception中的sql不会被执行,即get_salary(30)不会被执行。
如果循环中需要捕获异常,需要在可能存在异常的sql处添加begin/end,组成sql块;或者将exception放在循环外面,此时当某次循环中出现异常时整个循环终止,异常被exception捕获。
1、预定义异常
即oracle已定义的异常,无需在程序中定义,由ORACLE自动将其引发,可以直接使用定义的异常名称捕获。ORACLE预定义的异常情况大约有24个,如下。
错误号 异常错误信息名称 异常产生原因
ORA-0001 dup_val_on_index 违反了唯一性限制
ORA-0051 timeout_on_resource 在等待资源时发生超时
ORA-0061 transaction_backed_out 由于发生死锁事务被撤消
ORA-1001 invalid_cursor 试图使用一个无效的游标
ORA-1012 not_logged_on 没有连接到ORACLE
ORA-1017 login_denied 无效的用户名/口令
ORA-1403 no_data_found SELECT INTO没有找到数据
ORA-1410 sys_invalid_id 无效的 rowid 字符串
ORA-1422 too_many_rows SELECT INTO 返回多行
ORA-1476 zero_divide 除数为 0
ORA-1722 invalid_number 转换一个数字失败
ORA-6500 storage_error 内存不够引发的内部错误
ORA-6501 program_error 内部错误
ORA-6502 value_error 转换或截断错误(赋值时,变量长度不足以容纳实际数据)
ORA-6504 rowtype_mismatch 主游标变量与 PL/SQL变量有不兼容行类型
ORA-6511 curser_already_open 试图打开一个已处于打开状态的游标
ORA-6530 access_into_null 试图为null 对象的属性赋值
ORA-6531 collection_is_null 集合元素未初始化
ORA-6532 subscript_outside_limit 对嵌套或varray索引得引用超出声明范围以外
ORA-6533 subscript_beyond_count 对嵌套或varray 索引得引用大于集合中元素的个数.
ORA-6592 case_not_found case中若未包含相应的when,并且没有设置.
self_is_null 使用对象类型时,在 null 对象上调用对象方法
预定义异常可以通过异常名捕获处理,示例如下(所有示例以PLSQL执行):
declare cc varchar2(1000); nn number := 0; begin select t.label_value into cc from mem_users_label t where t.user_id = '111'; dbms_output.put_line('data found'); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('no data found'); end;
PLSQL执行结果为:
no data found
2、非预定义异常
即其他标准的ORACLE错误,但是oracle并没有对其进行定义。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。
创建测试表
create table ZL_TEST1 ( id VARCHAR2(10) not null, name VARCHAR2(10), age VARCHAR2(50), primary key(id) ); create table ZL_TEST2 ( id VARCHAR2(10), name VARCHAR2(30), age NUMBER ); alter table ZL_TEST2 add constraint PRI_FOREIGNID foreign key (ID) references ZL_TEST1 (ID);
插入测试数据
insert into zl_test1 values(1,'aa',12); insert into zl_test1 values(2,'ab',12); insert into zl_test1 values(3,'ac',12);
测试代码
declare deptno_remaining EXCEPTION; PRAGMA EXCEPTION_INIT(deptno_remaining, -2292); begin delete from zl_test1 where id='1'; EXCEPTION WHEN deptno_remaining THEN dbms_output.put_line('sqlcode is:'||SQLCODE||',error messesge is:'||SQLERRM); end;
3、自定义异常
需要根据实际情况自己定义错误消息,RAISE_APPLICATION_ERROR用于自定义错误消息,并且消息号必须在-20000~-20999之间,以便与oracle定义的错误区分开。用户定义的异常错误可以通过显式使用RAISE语句来触发,也可以通过RAISE_APPLICATION_ERROR定义。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
RAISE触发异常:
DECLARE no_result EXCEPTION; BEGIN UPDATE zl_test1 SET name = 'test' WHERE id = 8; IF SQL%NOTFOUND THEN RAISE no_result; END IF; EXCEPTION WHEN no_result THEN DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END;
RAISE_APPLICATION_ERROR定义异常
RAISE_APPLICATION_ERROR由oracle的DBMS_STANDARD包提供,语法如下:
RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors] );
error_number 是从 –20,000 到 –20,999 之间的参数,
error_message 是相应的提示信息(< 2048 字节),
keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。
示例:
创建表: CREATE TABLE errlog( Errcode NUMBER, Errtext CHAR(40));
创建函数: CREATE OR REPLACE FUNCTION get_salary(p_deptno NUMBER) RETURN NUMBER AS v_sal NUMBER; BEGIN IF p_deptno IS NULL THEN RAISE_APPLICATION_ERROR(-20991, ’部门代码为空’); ELSIF p_deptno<0 THEN RAISE_APPLICATION_ERROR(-20992, ’无效的部门代码’); ELSE SELECT SUM(employees.salary) INTO v_sal FROM employees WHERE employees.department_id=p_deptno; RETURN v_sal; END IF; END;
测试: DECLARE V_salary NUMBER(7,2); V_sqlcode NUMBER; V_sqlerr VARCHAR2(512); Null_deptno EXCEPTION; Invalid_deptno EXCEPTION; PRAGMA EXCEPTION_INIT(null_deptno,-20991); PRAGMA EXCEPTION_INIT(invalid_deptno, -20992); BEGIN V_salary :=get_salary(10); DBMS_OUTPUT.PUT_LINE('10号部门工资:' || TO_CHAR(V_salary)); BEGIN V_salary :=get_salary(-10); EXCEPTION WHEN invalid_deptno THEN V_sqlcode :=SQLCODE; V_sqlerr :=SQLERRM; INSERT INTO errlog(errcode, errtext) VALUES(v_sqlcode, v_sqlerr); COMMIT; END inner1; V_salary :=get_salary(20); DBMS_OUTPUT.PUT_LINE('部门号为20的工资为:'||TO_CHAR(V_salary)); BEGIN V_salary :=get_salary(NULL); END inner2; V_salary := get_salary(30); DBMS_OUTPUT.PUT_LINE('部门号为30的工资为:'||TO_CHAR(V_salary)); EXCEPTION WHEN null_deptno THEN V_sqlcode :=SQLCODE; V_sqlerr :=SQLERRM; INSERT INTO errlog(errcode, errtext) VALUES(v_sqlcode, v_sqlerr); COMMIT; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END outer;
4、总结
EXCEPTION必须放在begin/end代码块中:如上面的示例,inner1的代码块中包含exception,捕获到invalid_deptno异常并处理后继续执行,get_salary(20)正常执行,inner2代码块中并没有exception捕获异常,故此代码块终止,调到其父代码块,异常被最后的exception捕获,inner2到最后的exception中的sql不会被执行,即get_salary(30)不会被执行。
如果循环中需要捕获异常,需要在可能存在异常的sql处添加begin/end,组成sql块;或者将exception放在循环外面,此时当某次循环中出现异常时整个循环终止,异常被exception捕获。
declare cursor mycur is select * from mem_agingtype_labinf_syncbak where rownum<10; c_row mycur%rowtype; cc varchar2(1000); nn number := 0; begin for c_row in mycur loop nn := nn+1; begin select t.label_value into cc from mem_users_label t where t.user_id = c_row.user_id; EXCEPTION WHEN no_data_found THEN dbms_output.put_line('no data found'); end; dbms_output.put_line(nn); end loop; dbms_output.put_line('end loop'); end;
- oracle-error.zip (22.1 KB)
- 下载次数: 1
发表评论
-
oracle之分析函数
2020-03-11 14:07 0row_number() over(partition by ... -
oracle之日期函数
2016-12-20 10:55 9041、sysdate:返回当前日期 2、add_months(d ... -
oracle之数据字典
2016-07-18 18:55 0Oracle字典视图包括 ... -
oracle之回滚和undo表空间
2016-07-12 16:19 0Oracle undo表空间爆满的解决 1. 启 ... -
oracle之dblink
2016-07-12 14:34 0有时候需要从另一 ... -
oracle之监听配置文件
2016-07-11 13:57 0listener.ora文件为配置在oracle服务器 ... -
oracle的regexp_like函数使用正则表达式
2016-07-08 10:17 8894一、正则表达式入门 1. ... -
oracle中on、where、having的区别
2016-05-27 11:49 0http://www.cnblogs.com/java-cla ... -
面试准备
2016-05-14 22:57 0web安全测试: http://blog.sina.com.c ... -
常用sql
2016-04-28 15:52 01、删除表中重复数据 方式一:rowid select * f ... -
oracle之高水位线
2016-03-24 18:25 0insert /*+append*/ into table1 ... -
oracle11g自动分区
2016-03-23 21:07 879最近工作中需要给数据库创建分区,简单学习了一下,做下笔 ... -
oracle中rowid与rownum学习
2016-03-21 16:00 0rowid与rownum 都被称为伪列,但它们的存在方 ... -
SST
2016-01-21 16:57 0会员系统通过MQ获取CDH月结账号数据代码 1、插入 插 ... -
oracle排查异常sql的一些方法
2015-11-19 15:27 952转自http://blog.itpub.net/2315585 ... -
oracle导入导出
2015-11-13 18:37 0Oracle数据导入导出imp/exp就相当于oracle数据 ... -
oracle索引学习
2015-11-12 16:45 0一、索引基础 1、索引 ... -
oracle中to_char函数转换后多出空格的问题
2015-11-06 14:50 1422今天编写往数据库中插入200万数据的存储过程,遇到to ... -
好的网站
2015-09-11 13:54 0plsql开发笔记和小结 http://www.blogjav ... -
merge用法总结
2015-08-04 19:32 01、merge语法 merge [hit] into [ ...
相关推荐
15.PLSQL异常处理初步 16.SQL语句性能调整原则 17.创建和使用分区的表 18.基于成本的优化器一般错误概念和问题 19.Delphi 3_0中连接数据库的三种方式 20.远程数据库的访问 21.监控数据库性能的SQL 22...
Oracle自主学习资料,这是公司内部的核心资料,包括关系数据库与SQL语言环境、数据查询、数据操作、表和视图、其他数据库对象、PL/SQL基础、游标和异常处理、存储过程、函数和包、触发器等内容
6. PL/SQL的异常处理 102 7. 本章总结 108 8. 本章练习 109 Oracle应用于.Net平台 111 1. 回顾ADO.NET 112 2. 使用ADO.NET连接Oracle 113 3. 抽象工厂中加入Oracle 117 4. 本章总结 121 5. 本章练习 122 数据库导入...
Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/SQL 游标的使用 Oracle笔记 十、PL/SQL存储过程 Oracle笔记 十一、PL/SQL函数和触发器 Oracle笔记 十二、PL/SQL...
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员...
§5.2.1 在执行部分引发异常错误 13 §5.2.2 在声明部分引发异常错误 13 §5.3 异常错误处理编程 13 §5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 13 第六章 存储函数和过程 13 §6.1 引言 13 §6.2 创建函数 13 §6.3 ...
oracle 数据结构 ,游标,存储过程 ,函数 ,异常处理,触发器,包,定时任务等的学习,sql样例,
6 异常 10 7 存储过程 11 №1创建过程 11 №2调用过程 12 №3获取过程信息 12 №4删除过程 12 №5查看过程中的错误 13 №6实际应用示例(积分清零) 13 8 函数 14 №1创建函数 14 №2调用函数 15 №3获取函数信息 15...
学习Oracle 11g的新特性 第2章-Oracle 11g的安装与测试 能够使用Oracle 11g的基本条件 在Windows 2003上安装Oracle 11g 移除Oracle 11g 第3章-熟悉数据库 什么是数据库 范式,设计关系型数据库的准则 绘制...
同其他数据库管理系统相比,Oracle产品较为庞大而复杂,因此,令许多数据库管理系统的学习者在Oracle面前止步不前,究其原因,主要是无法掌握Oracle技术的脉络。本书正是根据作者在高校和各种数据库培训班执教多年的...
5、报告要有操作截图展示,字数要求4000字左右,以及对 oracle数据库的学习体会,要求字数1000字以上。 (2)学生需完成设计报告文档,文档不得雷同; (3)以班为单位由班长统一提交,设计的数据库以及电子文档以...
通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录...
通过学习书中的代码和图例,您不仅能访问和修改数据库信息,编写功能强大的PL/SQL 语句,执行有效的查询和部署稳固的安全性,还能轻松实现C、C++ 和Java 过程,建立可启用Web 的数据库,缩短开发时间和优化性能。...
同其他数据库管理系统相比,Oracle产品较为庞大而复杂,因此,令许多数据库管理系统的学习者在Oracle面前止步不前,究其原因,主要是无法掌握Oracle技术的脉络。本书正是根据作者在高校和各种数据库培训班执教多年的...
这是我自己学习oracle的时候,写的代码案例和笔记,基本上每一个知识点都写的很清楚!大家可以作为参考! 该有的知识点都有! 基本的sql语法,触发器,存储过程,存储函数, 流程控制,游标,异常处理,记录类型,...
通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录...
为了易于学习,这本独特的oracle press指南是这样组织的: ·核心概念——oracle database 11g主题呈现在按逻辑组织的章节中 ·主要内容——每章要介绍的具体内容列表 ·实践练习——演示如何应用在每章学到的...
《Oracle11g宝典》是Oracle数据库管理员、安全管理员、网络管理员、应用开发人员的参考指南,还是Oracle技术支持和培训机构、Oracle学习班、高等院校计算机专业数据库课程的参考教材和上机指导教材。每类人员都...
包括详细的操作步骤,具有很强的实战性和可操作性,适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员,尤其适用于入门、进阶以及希望深入研究Oracle技术的数据库管理人员。 第1章 数据库的启动...