自定义例外是指由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异常的更多相关文章

  1. 使用MySQL Migration Toolkit快速将Oracle数据导入MySQL[转]

    使用MySQL Migration Toolkit快速将Oracle数据导入MySQL上来先说点废话本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoDB非 ...

  2. 使用MySQLMigrationToolkit快速将Oracle数据导入MySQL

    使用MySQL Migration Toolkit快速将Oracle数据导入MySQL 上来先说点废话 本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoD ...

  3. 【风哥干货】快速解决Oracle数据库故障必备的20个脚本与命令

    1.操作系统性能(通常故障出现时最先检查的内容)top.topas.vmstat.iostat.free.nmon 2.万能重启方法 如应急情况,需要重启数据库:tail -100f <对应路径 ...

  4. oracle 异常

    ORACLE 异常错误处理 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 ...

  5. [转]ORACLE 异常错误处理

    本文转自:http://www.cnblogs.com/soundcode/archive/2012/01/10/2318385.html 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义 ...

  6. 总结:整理 oracle异常错误处理 .

    5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...

  7. Oracle异常汇总

    持续更新中,可参见https://hnuhell.gitbooks.io/oracle_errmg/content/或https://hnuhell.github.io/Oracle_ERRMG/上的 ...

  8. 整理 oracle异常错误处理

    5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...

  9. oracle 异常错误处理

    分类: Oracle 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2 ...

随机推荐

  1. 18 UI美化transition 图片过渡

    让两张图片在一定时间过渡 在工程文件res/drawable/transition文件 <?xml version="1.0" encoding="utf-8&qu ...

  2. 解决Scrollview 嵌套recyclerview不能显示,高度不正常的问题

    我们先看一个效果,问题说的就是中间的Grid效果在Scrollview 嵌套recyclerview显示问题,在Android Api 24是好的,不过在5,1,1版本(api 22)缺出现了问题 最 ...

  3. UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认

    在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不 ...

  4. Scipy教程 - 优化和拟合库scipy.optimize

    http://blog.csdn.net/pipisorry/article/details/51106570 最优化函数库Optimization 优化是找到最小值或等式的数值解的问题.scipy. ...

  5. Swift基础之闭包Closure学习

    首先Swift语言中没有了Block内容,但是你可以通过调用OC文件使用,也可以使用Closure(闭包),实现Block或者Delegae同样反向传值或回调函数的效果,也可以解决函数指针的问题,两者 ...

  6. Java中Integer和String浅谈

    Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...

  7. Java进阶(三十一) Web服务调用

    Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd5 ...

  8. Dynamics CRM2013 更新用户数据主要电子邮件字段报数据加密错误

    今天在更新用户数据中的主要邮件字段时报数据 可以进系统设置-数据管理-数据加密中开启,但前提是必须启用https访问而不能用http,在第二个框内输入秘钥点击激活就行了,我这边已经激活过了所以显示的是 ...

  9. 《java入门第一季》之有趣的集合小案例---获取10个【1-20之间】的随机数,要求不能重复。

    import java.util.ArrayList; import java.util.Random; /* * 获取10个[1-20之间]的随机数,要求不能重复.(注意:不是获取10个数,如果单纯 ...

  10. spring struts2 ibatis 框架结构图

    spring struts2 ibatis 框架结构图