源码-Oracle数据库管理-第十六章-异常处理机制-Part 2(自定义异常)

来源:互联网 发布:mac写java 编辑:程序博客网 时间:2024/05/16 10:57

调试心得:Oracle技术要不断提高,就得不断的做任务、实践、玩数据。

调试的过程中,又发现很多新的东西,真是“于无声处惊春雷”啊大笑

--16.2 自定义异常--16.2.1 异常声明--16.2.2 异常的作用域范围--代码16.5 在不同的语句块层次中定义相同名称的异常DECLARE   e_user_defined_exception   EXCEPTION;         --定义外层外异常BEGIN   DECLARE      e_user_defined_exception   EXCEPTION;      --在内层块中定义相同的异常   BEGIN      RAISE e_user_defined_exception;             --触发内层块中的异常   END;   RAISE e_user_defined_exception;                --触发外层块中的异常EXCEPTION   WHEN OTHERS THEN             --捕获并处理外层块中的异常      DBMS_OUTPUT.put_line ('出现了错误'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息                                END;--扩展1. 内外层异常同名时,内层异常具有高优先级DECLARE   e_user_defined_exception   EXCEPTION;         --定义外层外异常BEGIN   DECLARE      e_user_defined_exception   EXCEPTION;      --在内层块中定义相同的异常   BEGIN      RAISE e_user_defined_exception;             --触发内层块中的异常   END;   RAISE e_user_defined_exception;                --触发外层块中的异常EXCEPTION      WHEN e_user_defined_exception THEN             --捕获并处理外层块中的异常      DBMS_OUTPUT.put_line ('内层抛出未处理的异常,将在外层触发异常,该异常并不等同于外层块中定义的与其同名的异常'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息      WHEN OTHERS THEN             --捕获并处理外层块中的异常      DBMS_OUTPUT.put_line ('出现了错误'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息                                END;--扩展2. 内外层异常同名时,内层异常具有高优先级,取消内层异常时,外层异常正常发挥作用DECLARE   e_user_defined_exception   EXCEPTION;         --定义外层外异常BEGIN   DECLARE      e_user_defined_exception   EXCEPTION;      --在内层块中定义相同的异常   BEGIN      --RAISE e_user_defined_exception;             --触发内层块中的异常      null;   END;   RAISE e_user_defined_exception;                --触发外层块中的异常EXCEPTION      WHEN e_user_defined_exception THEN             --捕获并处理外层块中的异常      DBMS_OUTPUT.put_line ('取消内层异常时,外层异常正常发挥作用'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息      WHEN OTHERS THEN             --捕获并处理外层块中的异常      DBMS_OUTPUT.put_line ('出现了错误'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息                                END;--扩展3:内外层异常的嵌套DECLARE    e_user_defined_exception_o   EXCEPTION;         --定义外层块异常BEGIN   DECLARE      e_user_defined_exception_i   EXCEPTION;      --在内层块中定义异常   BEGIN      RAISE e_user_defined_exception_i;             --触发内层块中的异常   EXCEPTION         WHEN e_user_defined_exception_i THEN             --捕获并处理内层块中的异常      DBMS_OUTPUT.put_line ('触发了内层块异常'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息     END;   RAISE e_user_defined_exception_o;                --触发外层块中的异常EXCEPTION   WHEN e_user_defined_exception_o THEN             --捕获并处理外层块中的异常      DBMS_OUTPUT.put_line ('触发了外层块异常'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息        WHEN OTHERS THEN             --捕获并处理外层块中的异常      DBMS_OUTPUT.put_line ('触发了默认异常'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息                              END;--代码16.6 在不同的语句块层次中定义相同名称的异常DECLARE   e_outer_exception   EXCEPTION;          --定义外层块异常BEGIN   DECLARE      e_inner_exception   EXCEPTION;       --在内层块中定义内层块的异常   BEGIN      RAISE e_inner_exception;              --触发内层块中的异常      RAISE e_outer_exception;              --可行,在内层块中触发在外层块中定义的异常   END;   RAISE e_outer_exception;                  --触发外层块中的异常   --RAISE e_inner_exception;                --不可行,在外层块中触发内存块中的异常是非法的EXCEPTION   WHEN OTHERS THEN                   --捕获并处理外层块中的异常      DBMS_OUTPUT.put_line ('出现了错误'                            || ' 错误编号:'                            || SQLCODE                            || ' 错误名称:'                            || SQLERRM                           );    --显示错误编号和错误消息      END;--16.2.3 使用Exception_INIT编译指令--代码16.7 使用Exception_INIT创建命名异常--调试笔记:此段代码在PL/SQL Developer中不能成功调试,可在SQL Plus环境中调试DECLARE   e_missing_null   EXCEPTION;                          --先声明一个异常   PRAGMA EXCEPTION_INIT (e_missing_null, -1400);       --将该异常与-1400进行关联BEGIN   INSERT INTO emp(empno)VALUES (NULL);             --向emp表中不为空的列empno插入NULL值   COMMIT;                                             --如果执行成功则使用COMMIT提交EXCEPTION   WHEN e_missing_null THEN                            --如果失败则捕捉到命名的异常      DBMS_OUTPUT.put_line ('触发了ORA-01400错误!'||SQLERRM);      ROLLBACK;END;--16.2.4 使用Raise语句--代码16.8 使用Raise语句抛出异常DECLARE   e_nocomm   EXCEPTION;                     --自定义的异常   v_comm     NUMBER (10, 2);                  --临时保存提成数据的变量   v_empno    NUMBER (4)     := &empno;       --从绑定参数中获取员工信息BEGIN   SELECT comm INTO v_comm FROM emp WHERE empno = v_empno;  --查询并获取员工提成   IF v_comm IS NULL                            --如果没有提成   THEN       RAISE e_nocomm;                          --触发异常   END IF;EXCEPTION   WHEN e_nocomm THEN                        --处理异常      DBMS_OUTPUT.put_line ('选择的员工没有提成!');      --RAISE;                                 --调用RAISE方法再次抛出异常END;select * from emp where comm is null;--16.2.5 使用Raise_application_error--代码16.9 使用RAISE_APPLICATION_ERROR抛出异常--创建一个过程,在该过程体内部抛出一个异常CREATE or replace PROCEDURE account_status (  due_date DATE,  today    DATE) AUTHID DEFINER                            --指定定义者调用权限ISBEGIN  IF due_date < today THEN                   -- 判断过期日是否小于当前日期    RAISE_APPLICATION_ERROR(-20001, '账户已过期');  END IF;END;/--在匿名块中调用该过程,通过自定义异常来捕捉过程中抛出的异常 DECLARE  past_due  EXCEPTION;                         -- 自定义异常  PRAGMA EXCEPTION_INIT (past_due, -20001);  -- 分配错误代码给自定义异常BEGIN  account_status (SYSDATE-20, SYSDATE);   -- 调用子程序EXCEPTION  WHEN past_due THEN                         -- 处理自定义异常    DBMS_OUTPUT.put_line(TO_CHAR(SQLERRM(-20001)));END;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 裤子被卫生巾粘住扯不下来怎么办 医生说来姨妈不可以用卫生巾怎么办 隆胸以后摸起来感觉假体会动怎么办 产后15个月说恶露没排干净怎么办 母猪产后两天肚子里还有小猪怎么办 背心式无痕运动文胸显得胸小怎么办 卫生巾过敏起疙瘩反复挠不好怎么办 去健身房办卡老板跑了怎么办 买货我已经拒收商家不退款怎么办 在京东买了东西拒收不退款怎么办 罗马仕充电宝进入休眠状态怎么办 广发信用卡寄到家没拿到快递怎么办 包邮商家要买家出物流费怎么办? 美团外卖下单转化率低怎么办 京东退款不小心点了取消退款怎么办 近邻宝开了箱又关了怎么办 近邻宝箱子打开了东西忘记拿怎么办 京东取消订单商家总不取消怎么办 京东快递退货取件一直取不到怎么办 在京东线上付款了但没收到货怎么办 寄快递收件人电话号码写错了怎么办 京东购物实名认证被别人占用怎么办 货已发出单号还没填买家退货怎么办 自提柜还有一个包忘记拿怎么办 当顾客说衣服太贵的时候怎么办 京东快递送错了被别人签收了怎么办 乐视1s玩王者荣耀卡怎么办 京东商城买东西发现地址错了怎么办 京东分期付款买手机额度不够怎么办 亮皮银色高跟鞋时间放久变色怎么办 饿了么商家钱包提现被锁了怎么办 在淘手游买的游戏账号被找回怎么办 交易猫买手游梦幻号被找回了怎么办 绑定着苹果账号的邮箱忘记了怎么办 京东注册账号跟密码都忘记了怎么办 孩子大学一个宿舍宿友不行怎么办 微信手机支付密码忘记了怎么办 微信公众号不能付款了怎么办 头条误点了投放头条广告怎么办 交行网银密码错误6次怎么办 宁波新冮厦关门我们的消费卡怎么办