快速掌握Oracle异常
自定义例外是指由PL/SQL开发人员所定义的例外。预定义例外和非预定义例外都和Oracle错误有关,并且出现Oracle错误时会隐含的处罚相应例外;而自定义例外与Oracle错误没有任何关联,它是由开发人员为特定情况所定义的例外。
看一看以下PL/SQL块的运行。
declare
e_integrity exception;
pragma exception_init(e_integrity,-2291);
begin
update emp set deptno=&dno where empno=&eno;
exception
when e_integrity then
dbms_output.put_line('该部门不存在');
end;
使用例外函数:
1、SQLCODE 和SQLERRM
SQLCODE用于返回Oracle错误号,而SQLERRM则用于返回错误号所对应的错误消息。为了在PL/SQL应用程序中处理其他未预料到的Oracle错误,用户可以在例外处理部分的WHEN OTHERS 子句后引用这两个函数,以取得相关的Oracle错误.示例如下:
DECLARE
v_ename emp.ename%type;
BEGIN
SELECT ename INTO v_ename
FROM emp
WHERE sal=&v_sal;
dbms_output.put_line('雇员名:'||v_ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('不存在工资为'||&v_sal||'的雇员');
WHEN OTHERS THEN
dbms_output.put_line('错误号:'||SQLCODE);
dbms_output.put_line(SQLERRM);
END;
当输入v_sal:1250时。
错误号:-1422
ORA-01422: 实际返回的行数超出请求的行数
2. RAISE_APPLICATION_ERROR
该函数用于在PL/SQL应用程序中自定义错误消息。注意该过程只能在数据端的子过程(过程、函数、包、触发器)中使用,而不能在匿名块和客户端的子程序中使用,使用该函数的语法如下:
raise_application_error(error_number,message[ , {TRUE| FALSE}]);
其中,error_number用于定义错误号,该错误号必须是在-20000至-20999之间的负整数;message用于指定错误消息,并且该消息的长度不能超过2048字节;第三个参数为可选参数,如果设置为TURE,则该错误会放在先前错误的堆栈中;如果设置为FALSE(默认值),则会替换先前所有的错误。使用该过程的示例如下:
CREATE OR REPLACE PROCEDURE raise_comm
(eno number,
commission number
)
IS
v_comm emp.comm%TYPE; BEGIN
SELECT comm INTO v_comm
FROM emp
WHERE empno=eno;
IF v_comm IS NULL THEN
RAISE_APPLICATION_ERROR(-20021,'该雇员无补助啊',TRUE);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('该雇员不存在');
END;
call raise_comm(7900,100);
显示如下错误:
ORA-20021: 该雇员无补助啊
ORA-06512: 在 "SCOTT.RAISE_COMM", line 13
上面出现的错误,会在异常栈中打印出来。
下面是本人认为比较不错的异常处理方式:
一般情况下,我们会把异常名和异常号进行绑定,可能就是你所想要的结果吧
DECLARE
vnumber NUMBER(4);
biger EXCEPTION; --异常名
PRAGMA EXCEPTION_INIT(biger,-20001); --异常名和异常号绑定
equal EXCEPTION;
PRAGMA EXCEPTION_INIT(equal,-20002);
small EXCEPTION;
PRAGMA EXCEPTION_INIT(small,-20003);
BEGIN
vnumber:=&vnumber;
IF vnumber >10 THEN
RAISE_APPLICATION_ERROR(-20001,'哈哈,大于10啊');
ELSIF vnumber = 10 THEN
RAISE_APPLICATION_ERROR(-20002,'嗯,等于10...');
ELSIF vnumber < 10 THEN
RAISE_APPLICATION_ERROR(-20003,'哦,小于10啊');
END IF;
EXCEPTION
WHEN biger THEN
dbms_output.put_line('哈哈,大于10啊');
WHEN equal THEN
dbms_output.put_line('嗯,等于10...');
WHEN small THEN
dbms_output.put_line('哦,小于10啊');
END;
除了上面自定义的异常,我们还可以采用下面的这种方式定义异常
CREATE OR REPLACE PROCEDURE pro_emp
(
--- 多个用逗号隔开
v_eno IN NUMBER
)
IS
--------多个用分号隔开
v_max_id NUMBER;
v_ename VARCHAR2(10);
v_raise EXCEPTION; ---------定义一个异常
BEGIN
SELECT max(a.empno) into v_max_id from emp a;
IF v_eno >v_max_id THEN
RAISE v_raise; ---遇到例外,执行这个异常,退出程序 进入到Exception部分
END IF;
SELECT ename into v_ename from emp where empno=v_eno;
dbms_output.put_line('员工名称为:'||v_ename);
EXCEPTION
WHEN v_raise THEN ---------捕获v_raise异常
dbms_output.put_line('V_ENO大于最大员工号');
/* RAISE_APPLICATION_ERROR(-20000,'v_id not exists'); */
WHEN NO_DATA_FOUND THEN
/* RAISE_APPLICATION_ERROR(-20011,'ERROR:不存在');*/
dbms_output.put_line('没有获得有效数据');
END;
快速掌握Oracle异常的更多相关文章
- 使用MySQL Migration Toolkit快速将Oracle数据导入MySQL[转]
使用MySQL Migration Toolkit快速将Oracle数据导入MySQL上来先说点废话本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoDB非 ...
- 使用MySQLMigrationToolkit快速将Oracle数据导入MySQL
使用MySQL Migration Toolkit快速将Oracle数据导入MySQL 上来先说点废话 本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoD ...
- 【风哥干货】快速解决Oracle数据库故障必备的20个脚本与命令
1.操作系统性能(通常故障出现时最先检查的内容)top.topas.vmstat.iostat.free.nmon 2.万能重启方法 如应急情况,需要重启数据库:tail -100f <对应路径 ...
- oracle 异常
ORACLE 异常错误处理 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 ...
- [转]ORACLE 异常错误处理
本文转自:http://www.cnblogs.com/soundcode/archive/2012/01/10/2318385.html 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义 ...
- 总结:整理 oracle异常错误处理 .
5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...
- Oracle异常汇总
持续更新中,可参见https://hnuhell.gitbooks.io/oracle_errmg/content/或https://hnuhell.github.io/Oracle_ERRMG/上的 ...
- 整理 oracle异常错误处理
5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...
- oracle 异常错误处理
分类: Oracle 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2 ...
随机推荐
- matlab中的sub2ind函数
在matlab中,矩阵的存储是按列优先,sub2ind函数将矩阵中指定元素的行列下标转换成存储的序号,即线性索引号.下面,我们举例子进行说明. 1 建立一个3*4*2的矩阵 rng(0,'twiste ...
- Android 5.x 权限问题解决方法
android 5.x开始,引入了非常严格的selinux权限管理机制,我们经常会遇到因为selinux权限问题造成的各种avc denied困扰. 本文结合具体案例,讲解如何根据log来快速解决9 ...
- iOS开发之八:UISlider、UISegmentedControl、UIPageControl的使用
本文的三种控件,用的也非常多,而我也是经常图懒,而去打开原来的项目去拷贝,现在记录一下,就不用去项目中去找这些控件的用法了. 一.UIActivityIndicatorView 的使用 UIActiv ...
- [C++学习历程]Visual Studio 2010 的HelloWorld
大学时期曾学过C++的知识,那时候也没有使用VS这样高档的IDE工具,就是C++6.0那样来的.对于重新拾起C++来说,换了个IDE,那么就先从使用IDE学起吧~ 作者:苏生米沿 本文链接:http: ...
- Android项目-高考作文-AsyncTask的不足
1, AsyncTask的不足. 从android4.0开始, 后台只允许一个AsyncTask执行, 如果当前的AsyncTask没有执行完毕, 那么当前的请求一直处于等待状态. 直到上一个执行完毕 ...
- 分布式进阶(五)之JSVC配置
应用场景:在linux系统上进行项目开发,在部署java项目时,常用方法就是写一个shell脚本,但当服务器重启了,经常会忘了启动shell脚本了.所以我们需要把自己的应用变成linux的服务,当服务 ...
- Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)
前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...
- UIEvent UIResponder UI_04
1.事件(UIEvent),是由硬件设备捕捉到用户对设备的操作,把这个操作抽象成一个事件对象 ios中三大事件:触Touches摸晃动事件Motion,远程控制事件RemoteControl: ...
- 【一天一道LeetCode】#49. Group Anagrams
一天一道LeetCode系列 (一)题目 Given an array of strings, group anagrams together. For example, given: [" ...
- 【一天一道LeetCode】#44. Wildcard Matching
一天一道LeetCode系列 (一)题目 Implement wildcard pattern matching with support for '?' and '*'. '?' Matches a ...