一、例外分类
oracle将例外分为预定义例外、非预定义例外和自定义例外三种。
1)、预定义例外用于处理常见的oracle错误。
2)、非预定义例外用于处理预定义例外不能处理的例外。
3)、自定义例外用于处理与oracle错误无关的其它情况。下面通过一个小案例演示如果不处理例外看会出现什么情况?
编写一个存储过程,可接收雇员的编号,并显示该雇员的姓名。
sql代码如下:复制代码
SET SERVEROUTPUT ON;
DECLAREV_ENAME EMP.ENAME%TYPE;
BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO = &GNO;DBMS_OUTPUT.PUT_LINE('名字:' || V_ENAME);
END;
/
复制代码
随便输入不存在的编号,回车,会抛出如下异常:
ORA-01403: 未找到数据
ORA-06512: 在line 6    例外捕获的sql代码如下:复制代码
SET SERVEROUTPUT ON;
DECLAREV_ENAME EMP.ENAME%TYPE;
BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO = &GNO;DBMS_OUTPUT.PUT_LINE('名字:' || V_ENAME);
EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('编号未找到!');
END;
/
复制代码
随便输入不存在的编号,回车,会友情提示:编号未找到!二、处理预定义例外
预定义例外是由pl/sql所提供的系统例外。当pl/sql应用程序违反了oracle规定的限制时,则会隐含的触发一个内部例外。pl/sql为开发人员提供了二十多个预定义例外。我们给大家介绍常用的例外。
1)、case_not_found预定义例外
在开发pl/sql块中编写case语句时,如果在when子句中没有包含必须的条件分支,就会触发case_not_found例外:复制代码
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE SP_PRO6(SPNO NUMBER) ISV_SAL EMP.SAL%TYPE;
BEGINSELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = SPNO;CASEWHEN V_SAL < 1000 THENUPDATE EMP SET SAL = SAL + 100 WHERE EMPNO = SPNO;WHEN V_SAL < 2000 THENUPDATE EMP SET SAL = SAL + 200 WHERE EMPNO = SPNO;END CASE;
EXCEPTIONWHEN CASE_NOT_FOUND THENDBMS_OUTPUT.PUT_LINE('case语句没有与' || V_SAL || '相匹配的条件');
END;
/--调用存储过程
SQL> EXEC SP_PRO6(7369);
case语句没有与4444相匹配的条件
复制代码
2)、cursor_already_open预定义例外
当重新打开已经打开的游标时,会隐含的触发cursor_already_open例外复制代码
DECLARECURSOR EMP_CURSOR ISSELECT ENAME, SAL FROM EMP;
BEGINOPEN EMP_CURSOR; --声明时游标已打开,所以没必要再次打开FOR EMP_RECORD1 IN EMP_CURSOR LOOPDBMS_OUTPUT.PUT_LINE(EMP_RECORD1.ENAME);END LOOP;
EXCEPTIONWHEN CURSOR_ALREADY_OPEN THENDBMS_OUTPUT.PUT_LINE('游标已经打开');
END;
/
复制代码
3)、dup_val_on_index预定义例外
在唯一索引所对应的列上插入重复的值时,会隐含的触发例外复制代码
BEGININSERT INTO DEPT VALUES (10, '公关部', '北京');
EXCEPTIONWHEN DUP_VAL_ON_INDEX THENDBMS_OUTPUT.PUT_LINE('在deptno列上不能出现重复值');
END;
/
复制代码
4)、invalid_cursorn预定义例外
当试图在不合法的游标上执行操作时,会触发该例外
例如:试图从没有打开的游标提取数据,或是关闭没有打开的游标。则会触发该例外复制代码
DECLARECURSOR EMP_CURSOR ISSELECT ENAME, SAL FROM EMP;EMP_RECORD EMP_CURSOR%ROWTYPE;
BEGIN--open emp_cursor; --打开游标FETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);CLOSE EMP_CURSOR;
EXCEPTIONWHEN INVALID_CURSOR THENDBMS_OUTPUT.PUT_LINE('请检测游标是否打开');
END;
/
复制代码
5)、invalid_number预定义例外
当输入的数据有误时,会触发该例外
比如:数字100写成了loo就会触发该例外复制代码
SET SERVEROUTPUT ON;
BEGINUPDATE EMP SET SAL = SAL + 'AAA';
EXCEPTIONWHEN INVALID_NUMBER THENDBMS_OUTPUT.PUT_LINE('输入的数字不正确');
END;
/
复制代码
6)、no_data_found预定义例外
下面是一个pl/sql 块,当执行select into没有返回行,就会触发该例外复制代码
SET serveroutput ON;
DECLAREV_SAL EMP.SAL%TYPE;
BEGINSELECT SAL INTO V_SAL FROM EMP WHERE ENAME = 'ljq';
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('不存在该员工');
END;
/
复制代码
7)、too_many_rows预定义例外
当执行select into语句时,如果返回超过了一行,则会触发该例外。复制代码
DECLAREV_ENAME EMP.ENAME%TYPE;
BEGINSELECT ENAME INTO V_ENAME FROM EMP;
EXCEPTIONWHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE('返回了多行');
END;
/
复制代码
8)、zero_divide预定义例外
当执行2/0语句时,则会触发该例外
9)、value_error预定义例外
当在执行赋值操作时,如果变量的长度不足以容纳实际数据,则会触发该例外value_error其它预定义例外(这些例外不是在pl/sql里触发的,而是在用oracle时触发的,所以取名叫其它预定义例外)
1、login_denied
当用户非法登录时,会触发该例外
2、not_logged_on
如果用户没有登录就执行dml操作,就会触发该例外
3、storage_error
如果超过了内存空间或是内存被损坏,就触发该例外
4、timeout_on_resource
如果oracle在等待资源时,出现了超时就触发该例外三、非预定义例外
非预定义例外用于处理与预定义例外无关的oracle错误。使用预定义例外只能处理21个oracle 错误,而当使用pl/sql开发应用程序时,可能会遇到其它的一些oracle错误。比如在pl/sql块中执行dml语句时,违反了约束规定等等。在这样的情况下,也可以处理oracle的各种例外,因为非预定义例外用的不多,这里我就不举例了。四、处理自定义例外
预定义例外和自定义例外都是与oracle错误相关的,并且出现的oracle 错误会隐含的触发相应的例外;而自定义例外与oracle 错误没有任何关联,它是由开发人员为特定情况所定义的例外.
问题:请编写一个pl/sql 块,接收一个雇员的编号,并给该雇员工资增加1000元,如果该雇员不存在,请提示。复制代码
CREATE OR REPLACE PROCEDURE EX_TEST(SPNO NUMBER) IS
BEGINUPDATE EMP SET SAL = SAL + 1000 WHERE EMPNO = SPNO;
END;
/--调用存储过程,
EXEC EX_TEST(56);
复制代码
这里,编号为56 是不存在的,刚才的报异常了,为什么现在不报异常呢?
因为刚才的是select语句
怎么解决这个问题呢? 修改代码,如下:复制代码
--自定义例外
CREATE OR REPLACE PROCEDURE EX_TEST(SPNO NUMBER) IS
--定义一个例外
MYEX EXCEPTION;
BEGIN
--更新用户sal
UPDATE EMP SET SAL = SAL + 1000 WHERE EMPNO = SPNO;
--sql%notfound 这是表示没有update
--raise myex;触发myex
IF SQL%NOTFOUND THEN RAISE MYEX;
END IF;
EXCEPTION
WHEN MYEX THEN DBMS_OUTPUT.PUT_LINE('没有更新任何用户');
END;
/

转载于:https://www.cnblogs.com/c0liu/p/5450622.html

二十七、oracle 异常相关推荐

  1. 吴恩达机器学习(二十七)异常检测、高斯分布

    目录 1.异常检测 2.高斯分布 3.异常检测VS监督学习 4.选择要使用的功能 5.多变量高斯分布以及它在异常检测中的应用 1.异常检测   这一章中将介绍异常检测问题,这是机器学习算法的常见应用, ...

  2. 【零基础学Java】—对象的向上和向下转型(二十七)

    [零基础学Java]-对象的向上转型(二十七) 对象的向上转型,其实就是多态的写法 格式:父类名称 对象名=new 子类名称(): 含义:右侧创建一个子类对象,把它当做父类来看待使用 注意事项:向上转 ...

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

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

  4. 读后感:沙场秋点兵---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十七)

    沙场秋点兵---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十七) http://blog.csdn.net/david_lv/archive/2008/07/02/2604704.aspx ...

  5. 2021年大数据Hadoop(二十七):YARN运行流程

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn运行流程 本系列历史文章 2021年大数据Hado ...

  6. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

    游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云    邮箱: happylifemxy@163.com    期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...

  7. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示

    实验二十七:TFT模块 - 显示 所谓TFT(Thin Film Transistor)就是众多LCD当中,其中一种支持颜色的LCD,相较古老的点阵LCD(12864笑),它可谓高级了.黑金的TFT ...

  8. Oracle数据库基础入门《二》Oracle内存结构

    Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...

  9. 微信小程序把玩(二十七)audio组件

    微信小程序把玩(二十七)audio组件 原文:微信小程序把玩(二十七)audio组件 音频播放已经封装的很好!只需配合属性设置即可! (method和data配合使用) 主要属性: wxml < ...

  10. 二 查看oracle归档日志路径

    一,检查是否开启归档,开启的方法 数据的存档模式的操作必须要在mount中进行,且数据库要处于非open状态.所有关闭存档模式前,我们需要查看当前数据库的状态,并且关闭数据库,启动到mount,才可进 ...

最新文章

  1. 施工企业项目管理的系统修炼_施工企业项目亏损的11个主观因素
  2. 互联网运营面试题_产品运营成长必修课:做好项目复盘
  3. 黑客勒索遭遇霸气回应:不怕,我们有备份
  4. python数据结构3-链表
  5. Linux 下如何彻底卸载MySQL数据库
  6. 利用matlab实现卷积实验报告,matlab卷积实验报告(共8篇).doc
  7. 图解PROFINET——PROFINET IO设备类型
  8. 怎么更换照片背景颜色
  9. 三消类游戏的核心算法
  10. 【习题5】用Python完成新建文档写古诗+复制
  11. 说说你对keep-alive的理解是什么?
  12. 不忘初心,勇攀高峰!低代码公司流辰信息紧抓机遇,努力超前冲!
  13. 快速排序_查找第k小元素
  14. Java算法 -- 二分查找:查找目标元素最左的位置和最右的位置、局部最小值问题求解
  15. C语言编程勾股数,C语言求勾股数
  16. 过孔----通孔,盲孔,埋孔
  17. lpfs存储服务器怎样维护,ipfs云节点存储服务器
  18. python学习之爬取ts流电影
  19. vsp左右分屏显示操作
  20. Unity添加Animation不播放

热门文章

  1. python for a,b in c
  2. python set和frozenset 异同点学习记录
  3. 2021-06-27面向对象继承
  4. 电脑硬盘右击计算机就卡死,Win10电脑使用过程中莫名其妙卡死的的三种解决方法...
  5. thinkphp 捕捉错误
  6. 设计模式之GOF23模板模式
  7. vue学习-处理边界-依赖注入
  8. php如何防止网站被攻击,防止网站被攻击的办法
  9. java基础总结06-常用api类-Math常用方法
  10. lnmp团队开发环境docker环境搭建PHP7.2 mac系统为例