Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 448|回复: 0

(Oracle)预定义异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-26 12:34:54 | 显示全部楼层 |阅读模式

    预定义异常:  

      为了 Oracle 开发和维护的方便,在 Oracle 异常中,为常见的异常码定义了对应的异常名称,称为预定义异常,常见的预定义异常有:

    异常名称 异常码 描述
    DUP_VAL_ON_INDEX ORA-00001 试图向唯一索引列插入重复值
    INVALID_CURSOR ORA-01001 试图进行非法游标操作。
    INVALID_NUMBER ORA-01722 试图将字符串转换为数字
    NO_DATA_FOUND ORA-01403 SELECT INTO 语句中没有返回任何记录。
    TOO_MANY_ROWS ORA-01422 SELECT INTO 语句中返回多于 1 条记录。
    ZERO_DIVIDE ORA-01476 试图用 0 作为除数。
    CURSOR_ALREADY_OPEN ORA-06511 试图打开一个已经打开的游标


      PL/SQL 中用 EXCEPTION 关键字开始异常处理。具体语法是:语法格式:异常处理

    BEGIN
    --可执行部分
    EXCEPTION -- 异常处理开始
    WHEN 异常名 1 THEN
    --对应异常处理
    WHEN 异常名 2 THEN
    --对应异常处理
    ……
    WHEN OTHERS THEN
    --其他异常处理
    END;


    语法解析:
    异常发生时,进入异常处理部分,具体的异常与若干个 WHEN 子句中指明的异常名匹配,匹配成功就进入对应的异常处理部分,如果对应不成功,则进入 OTHERS 进行处理。
    案例:

    代码演示:异常处理
    SQL> DECLARE
    2 newSal emp.sal % TYPE;
    3 BEGIN
    4 SELECT sal INTO newSal FROM emp;
    5 EXCEPTION
    6 WHEN TOO_MANY_ROWS THEN
    7 dbms_output.put_line('返回的记录太多了');
    8 WHEN OTHERS THEN
    9 dbms_output.put_line('未知异常');
    10 END;
    11 /
    返回的记录太多了PL/SQL procedure successfully completed

    自定义异常:

      除了预定义异常外,用户还可以在开发中自定义异常,自定义异常可以让用户采用与PL/SQL 引擎处理错误相同的方式进行处理,用户自定义异常的两个关键点:
          1. 异常定义:在 PL/SQL 块的声明部分采用 EXCEPTION 关键字声明异常,定义方法与定义变量相同。比如声明一个 myexception 异常方法是:
                myexception EXCEPTION
           2. 异常引发:在程序可执行区域,使用 RAISE 关键字进行引发。比如引发 myexception方法是:
                RAISE myexception;
    案例:

    代码演示:自定义异常
    SQL> DECLARE
    2 sal emp.sal%TYPE;
    3 myexp EXCEPTION; ①
    4 BEGIN
    5 SELECT sal INTO sal FROM emp WHERE ename='JAMES';
    6 IF sal<5000 THEN
    7 RAISE myexp; ②
    8 END IF;
    9 EXCEPTION
    10 WHEN NO_DATA_FOUND THEN
    11 dbms_output.put_line('NO RECORDSET FIND!');
    12 WHEN MYEXP THEN13 dbms_output.put_line('SAL IS TO LESS!');
    14 END;
    15 /
    SAL IS TO LESS!
    PL/SQL procedure successfully completed
    代码解析:
    ① 用 EXCEPTION 定义一个异常变量 myexp
    ② 在一定条件下用 RAISE 引发异常 myexp ③ 在异常处理部分,捕获异常,如果不处理异常,该异常就抛给程序执行者。

    引发应用程序异常

      在 Oracle 开发中,遇到的系统异常都有对应的异常码,在应用系统开发中,用户自定义的异常也可以指定一个异常码和异常信息, Oracle 系统为用户预留了自定义异常码,其范围介于-20000 -20999 之间的负整数。引发应用程序异常的语法是:

      RAISE_APPLICATION_ERROR(异常码,异常信息)

    案例:

    代码演示:引发应用系统异常
    SQL> DECLARE
    2 sal emp.sal%TYPE;
    3 myexp EXCEPTION;
    4 BEGIN
    5 SELECT sal INTO sal FROM emp WHERE ename='JAMES';
    6 IF sal<5000 THEN
    7 RAISE myexp;
    8 END IF;
    9 EXCEPTION
    10 WHEN NO_DATA_FOUND THEN
    11 dbms_output.put_line('NO RECORDSET FIND!');
    12 WHEN MYEXP THEN
    13 RAISE_APPLICATION_ERROR(-20001,'SAL IS TO LESS!'); ①
    14 END;
    15 /
    ORA-20001: SAL IS TO LESS! ②
    ORA-06512: 在 line 14
    代码解析:
    ① 引发应用系统异常,指明异常码和异常信息。
    ② 在控制台上显示异常码和异常信息。

      如果要处理未命名的内部异常,必须使用 OTHERS 异常处理器。也可以利用 PRAGMA EXCEPTION_INIT 把一个异常码与异常名绑定。PRAGMA 由编译器控制, PRAGMA 在编译时处理,而不是在运行时处理。 EXCEPTION_INIT告诉编译器将异常名与 ORACLE错误码绑定起来,这样可以通过异常名引用任意的内部异常,并且可以通过异常名为异常编写适当的异常处理器。 PRAGMA EXCEPTION_INIT 的语法是:

        PRAGMA EXCEPTION_INIT(异常名,异常码)

      这里的异常码可以是用户自定义的异常码,也可以是 Oracle 系统的异常码。

    案例:

    代码演示:PRAGMA EXCEPTION_INIT 异常
    <<outterseg>>
    DECLARE
    null_salary EXCEPTION;
    PRAGMA EXCEPTION_INIT(null_salary, -20101); ①
    BEGIN
    <<innerStart>>DECLARE
    curr_comm NUMBER;
    BEGIN
    SELECT comm INTO curr_comm FROM emp WHERE empno = &empno;
    IF curr_comm IS NULL THEN
    RAISE_APPLICATION_ERROR(-20101, 'Salary is missing'); ③
    ELSE
    dbms_output.put_line('有津贴');
    END IF;
    END;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    dbms_output.put_line('没有发现行');
    WHEN null_salary THEN
    dbms_output.put_line('津贴未知'); ④
    WHEN OTHERS THEN
    dbms_output.put_line('未知异常');
    END;
    代码解析:
    ① 把异常名称 null_salary 与异常码
    -20101 关联,该语句由于是预编译语句,必须放在声明部分。也就是说-20101 的异常名称就是 null_salary。 ② 嵌套 PL/SQL 语句块 ③ 在内部 PL/SQL 语句块中引发应用系统异常-20101。 ④ 在外部的 PL/SQL 语句块中就可以用异常名 null_salary 进行捕获。
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-23 01:11 , Processed in 0.057579 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表