Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
抛出异常
Oracle有三种类型的异常错误:
1. 预定义(Predefined)异常
ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。
2. 非预定义(Predefined)异常
即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。
3. 用户定义(User_define)异常
程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。
在PL/SQL中有三种方式抛出异常
通过PL/SQL运行时引擎——抛出Oracle异常
使用RAISE语句——抛出用户定义异常
调用RAISE_APPLICATION_ERROR存储过程——抛出用户定义异常
非预定义异常
因为非预定义异常只有编号,没有名称,所以不能直接处理。
1、在PL/SQL 块的定义部分定义异常情况:
<异常情况> EXCEPTION;
2、将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:
);
3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
INSERT INTO departments VALUES(50, 'FINANCE', 'CHICAGO'); DECLARE
v_deptno departments.department_id%TYPE := &deptno;
deptno_remaining EXCEPTION; --1、定义异常
PRAGMA EXCEPTION_INIT(deptno_remaining, -2292); --2、关联
-- -2292 是违反一致性约束的错误代码
BEGIN
DELETE FROM departments WHERE department_id = v_deptno;
EXCEPTION
WHEN deptno_remaining THEN --3、处理
DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
用户自定义异常处理
用户定义的异常错误是通过显式使用 RAISE 语句来触发。
1、在PL/SQL 块的定义部分定义异常情况 ;
2、RAISE <异常情况>;
3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
DECLARE
v_empno employees.employee_id%TYPE :=&empno;
no_result EXCEPTION; --1、定义
BEGIN
UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
IF SQL%NOTFOUND THEN
RAISE no_result; --2、抛出
END IF;
EXCEPTION
WHEN no_result THEN --3、处理
DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
RAISE_APPLICATION_ERROR
调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,将应用程序专有的错误从服务器端转达到客户端应用程序。它为应用程序提供了一种与ORACLE交互的方法。
语法如下:
RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors] );
- error_number 是从 –20,000 到 –20,999 之间的参数,这样就不会与 ORACLE 的任何错误代码发生冲突
- error_message 是相应的提示信息(< 2048 字节),
- keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。
There are two uses for RAISE_APPLICATION_ERROR.
The first is to replace generic Oracle exception messages with our own, more meaningful messages.
The second is to create exception conditions of our own, when Oracle would not throw them.
create or replace procedure new_emp
( p_name in emp.ename%type
, p_sal in emp.sal%type
, p_job in emp.job%type
, p_dept in emp.deptno%type
, p_mgr in emp.mgr%type
, p_hired in emp.hiredate%type := sysdate )
is
invalid_manager exception; --1、定义
PRAGMA EXCEPTION_INIT(invalid_manager, -2291); --2、关联
dummy varchar2(1);
begin
if trunc(p_hired) > trunc(sysdate)
then
raise_application_error
(-20000, 'NEW_EMP::hiredate cannot be in the future'); --3、抛出自定义异常
end if; insert into emp
( ename
, sal
, job
, deptno
, mgr
, hiredate )
values
( p_name
, p_sal
, p_job
, p_dept
, p_mgr
, trunc(p_hired) );
exception
when dup_val_on_index then
raise_application_error
(-20001, 'NEW_EMP::employee called '||p_name||' already exists', true); --3、包装Oracle异常
when invalid_manager then
raise_application_error
(-20002, 'NEW_EMP::'||p_mgr ||' is not a valid manager'); --3、包装自定义异常 end;
/
客户端调用时会提示详细异常信息:
-- 测试RAISE_APPLICATION_ERROR自定义异常
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1); END; *
ERROR at line 1:
ORA-20000: NEW_EMP::hiredate cannot be in the future --ORA-20000
ORA-06512: at "APC.NEW_EMP", line 16
ORA-06512: at line 1 -- 测试RAISE_APPLICATION_ERROR包装自定义异常
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate); END; *
ERROR at line 1:
ORA-20002: NEW_EMP::8888 is not a valid manager
ORA-06512: at "APC.NEW_EMP", line 42
ORA-06512: at line 1 -- 测试RAISE_APPLICATION_ERROR包装Oracle异常
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate) PL/SQL procedure successfully completed. SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate); END; *
ERROR at line 1:
ORA-20001: NEW_EMP::employee called DUGGAN already exists
ORA-06512: at "APC.NEW_EMP", line 37
ORA-00001: unique constraint (APC.EMP_UK) violated --同时打印原始堆栈
ORA-06512: at line 1
Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR的更多相关文章
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
- oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)
什么是异常?在PL/SQL中的一个标识.在程序运行期间被触发的错误.异常是怎样被触发的?产生一个Oracle错误.用户显示触发.怎样处理异常?用异常处理句柄捕获异常.传播异常到调用环境. 捕获异常 E ...
- [Oracle] PL/SQL学习笔记
-- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...
- Oracle PL/SQL编程
一.PL/SQL简介 1.概念:PL/SQL是Oracle在标准SQL语言上的过程性扩展. 2.优点和特性 提高应用程序的运行性能 提供模块化的程序设计功能 允许定义标示符 具有过程语言控制结构 具备 ...
- Oracle Pl/SQL编程基础
Pl/SQL简介 提高应用程序的运行性能, 提供模块化的程序设计, 自定义标示符, 具有过程语言控制结构, 良好的兼容性, 处理运行错误. Pl/SQL语言基础 sql是关系数据库的基本操作语言. s ...
- 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航
原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
随机推荐
- 动画api说明
1.Animation的API参考文档:http://blog.csdn.net/harvic880925/article/details/40117115 2.动画插值器的参考: http://bl ...
- SGU 106 The Equation 扩展欧几里得应用
Sol:线性不定方程+不等式求解 证明的去搜下别人的证明就好了...数学题. #include <algorithm> #include <cstdio> #include & ...
- c语言利用指针计算字符串的长度
可以用strlen函数,这里我们自己写一个. 注意:不能用scanf,scanf一遇到空格就认为输入结束.应该用gets(),遇到换行符或EOF结束.说明可以接受空格. #include<cst ...
- 【JSP】JSP与oracle数据库交互案例
************************************************************************ ****原文:blog.csdn.net/clark_ ...
- SPField的GetValidatedString方法没有被调用
当我们开发自定义类型的Field时,可能会用到GetValidatedString这个方法. 但是有时候这个方法并没被调用 原因是: 当Field的Value为null时,该方法不会被调用 解决办法: ...
- Blog 转移
Blog 转移至 http://blog.rapcoder.com CSDN : http://blog.csdn.net/a542551042 欢迎一起交流 学习 ,谢谢!!!
- ul不加宽高
ul可以不加宽高,但是不能用margin(上下左右), 可以用margin(左右),否则里面的内容如果是要左右浮动的话,就会掉下来
- Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php
Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php 1. Keyword/subtitle 1 2. 使用dwr3的异常convert处 ...
- ASP.NET - 编写让别人能读懂的代码
http://www.cnblogs.com/richieyang/p/4840614.html
- Appium 的安装启动
Appium 的安装方式根据官网提供的是使用nodejs 安装,但是官方给出了三种方法 参考网址: appium下载地址: https://bitbucket.org/appium/appium.ap ...