源码-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
- 源码-Oracle数据库管理-第十六章-异常处理机制-Part 2(自定义异常)
- 源码-Oracle数据库管理-第十六章-异常处理机制-Part 1(理解异常处理)
- 源码-Oracle数据库管理-第十六章-异常处理机制-Part 3(处理异常)
- 源码-PL/SQL从入门到精通-第十二章-异常处理机制-Part 2
- 自定义异常处理机制
- oracle异常处理机制
- oracle异常处理机制
- 源码-PL/SQL从入门到精通-第十二章-异常处理机制-Part 1
- 源码-Oracle数据库管理-第七章-视图-Part 2
- 源码-Oracle数据库管理-第十一章-Oracle内置函数-Part 2(字符型函数)
- 源码-Oracle数据库管理-第十八章-事务和锁-Part 2_1(使用Oracle锁)
- 源码-Oracle数据库管理-第十八章-事务和锁-Part 2_2(使用Oracle锁)
- c++自定义异常处理机制
- c++自定义异常处理机制 .
- springmvc 自定义异常处理机制
- Java异常处理:Part 2
- 源码-Oracle数据库管理-第十九章-数据库安全性管理-Part 1_1(用户管理)
- 第十六天:异常处理
- 12--配置IDEA远程调试Hadoop程序(Hadoop HA下)
- java并发编程(六)----(JUC)Semaphore
- 数据源
- 串口驱动开发学习
- LeetCode解题报告 110. Balanced Binary Tree [easy]
- 源码-Oracle数据库管理-第十六章-异常处理机制-Part 2(自定义异常)
- 2016秋季网络程序设计学习总结
- valgrind的命令
- NYOJ1057:寻找最大数(三)
- 分支结构2:switch语句和一些常用的循环语句
- jQuery与DOM对象的相互转化
- tomcat启动慢, Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] mil
- ceph-deploy安装monitor的问题
- catalog备份数据库及RMAN存储脚本