Oracle 异常处理

标签: oracle 异常处理 | 发表时间:2014-10-24 02:13 | 作者:chaoyi
出处:http://www.iteye.com

RAISE_APPLICATION_ERROR

/*
===========================================================
|         使用RAISE_APPLICATION_ERROR存储过程。
============================================================
*/
--演示该存储过程
BEGIN
      RAISE_APPLICATION_ERROR(-20000, 'Account past due.');-- explicitly raise exception
END;

--创建子程序
CREATE OR REPLACE PROCEDURE account_status (
   due_date DATE,
   today DATE
) 
IS
BEGIN
   IF due_date < today THEN 
      RAISE_APPLICATION_ERROR(-20000, 'Account past due.');-- explicitly raise exception
   END IF;
END;
/

--调用子程序
DECLARE
   past_due EXCEPTION; -- declare exception
   PRAGMA EXCEPTION_INIT (past_due, -20000); 
BEGIN
    account_status (to_date('2010-7-9','yyyy-mm-dd'), to_date('2010-7-10','yyyy-mm-dd')); -- invoke procedure
EXCEPTION
   WHEN past_due THEN -- handle exception
       DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQLERRM(-20000)));
END;

/*
===========================================================
|         使用用户自定义实现。
============================================================
*/


CREATE OR REPLACE PROCEDURE account_status (
   due_date DATE,
   today DATE
) 
IS
 past_due EXCEPTION; -- declare exception
BEGIN
   IF due_date < today THEN 
      RAISE past_due; -- explicitly raise exception
   END IF;
EXCEPTION
   WHEN past_due THEN -- handle exception
      DBMS_OUTPUT.PUT_LINE ('Account past due.');
     -- INSERT INTO t VALUES(due_date);
END;
/
--调用子程序

BEGIN
   account_status ('2010-7-9', '2010-7-10'); -- invoke procedure
END;

 

用户自定义异常

/*
===========================================================
|         查询编号为7788的雇员的福利补助(comm列)。
============================================================
*/
DECLARE
 	v_comm employee.comm%TYPE;
	e_comm_is_null EXCEPTION; --定义异常类型变量
BEGIN
	SELECT comm INTO v_comm FROM employee WHERE empno=7788;
	IF v_comm IS NULL THEN
	   RAISE e_comm_is_null;
	END IF;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
       dbms_output.put_line('雇员不存在!错误为:'||SQLCODE||SQLERRM);
    WHEN e_comm_is_null THEN
	     dbms_output.put_line('该雇员无补助');
    WHEN others THEN
	     dbms_output.put_line('出现其他异常');
END;

 

非预定义异常

/*
===========================================================
|         非预定义异常
============================================================
*/

--需求:修改编号为7788的雇员所属的部门编号为99。
--前提是要在employee和dept表建立主外键约束
ALTER TABLE employee 
   ADD  CONSTRAINT pk_empno PRIMARY KEY(empno);
ALTER TABLE dept 
   ADD  CONSTRAINT pk_deptno PRIMARY KEY(deptno);
ALTER TABLE employee 
   ADD  CONSTRAINT fk_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);

DECLARE
   e_integrity EXCEPTION;
   PRAGMA EXCEPTION_INIT(e_integrity,-2291);  --  -2291为Oracle定义的错误号,违背了主外键约束
BEGIN
 update employee set deptno=99 where empno=7788;
EXCEPTION
   WHEN e_integrity THEN
      dbms_output.put_line('该部门不存在');
END;

SELECT * FROM employee;

 

预定义异常

/*
===========================================================
|         预定义异常
============================================================
*/
--未进行异常处理
DECLARE   
   v_ename employee.ename%TYPE;
BEGIN
   SELECT ename INTO v_ename 
   FROM employee     
   WHERE empno=1234;
   dbms_output.put_line('雇员名:'||v_ename);
END;

--进行异常处理
DECLARE
   v_ename employee.ename%TYPE;
BEGIN
   SELECT ename INTO v_ename 
   FROM employee 
   WHERE empno=1234;
   dbms_output.put_line('雇员名:'||v_ename);
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      dbms_output.put_line('雇员号不正确');   
   WHEN TOO_MANY_ROWS THEN
      dbms_output.put_line('查询只能返回单行');
   WHEN OTHERS THEN
      dbms_output.put_line('错误号:'||SQLCODE||'错误描述:'||SQLERRM);
END;

 

 





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [oracle 异常处理] 推荐:

Oracle 异常处理

- - 编程语言 - ITeye博客
使用RAISE_APPLICATION_ERROR存储过程. ============================================================ */ --演示该存储过程 BEGIN. RAISE_APPLICATION_ERROR(-20000, 'Account past due.');-- explicitly raise exception END; --创建子程序 CREATE OR REPLACE PROCEDURE account_status (.

Oracle异常处理概念

- - Oracle - 数据库 - ITeye博客
5.1.1 预定义的异常处理. 5.1.2 非预定义的异常处理. 5.1.3 用户自定义的异常处理. 5.1.4  用户定义的异常处理. 5.2.1 在执行部分引发异常错误. 5.2.2 在声明部分引发异常错误. 5.3 异常错误处理编程. 5.4  在 PL/SQL 中使用 SQLCODE, SQLERRM异常处理函数.

Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR

- - CSDN博客互联网推荐文章
Oracle有三种类型的异常错误:. 1. 预定义(Predefined)异常. ORACLE预定义的异常情况大约有24个. 对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. 2. 非预定义(Predefined)异常. 即其他标准的ORACLE错误. 对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发.

spring mvc 异常处理(转)

- - 编程语言 - ITeye博客
链接:http://gaojiewyh.iteye.com/blog/1297746 (附源码). 链接:http://zywang.iteye.com/blog/983801 . 链接:http://www.cnblogs.com/xguo/p/3163519.html . 链接:http://fuliang.iteye.com/blog/947191 .

Java异常处理策略

- - 研发管理 - ITeye博客
任务与预先设定的规则不相符的情况都可以称之为异常. 但凡业务逻辑操作,都会划定一些边界或规则,但是往往事与愿违,总会有调皮鬼来挑战系统的健壮性. 用户并不都是知道潜规则的,比如用户的银行账户中只有100块钱,但是用户不查询就直接取200块. 码农有时候太过自信了,比如你在编写文件下载功能时忽略了文件有可能不存在这个分支流程.

【javaScript基础】异常处理

- - CSDN博客Web前端推荐文章
         理解异常在javaScript面向对象编程是非常重要的,异常是一种非常强大的处理错误的方式.          首先我们来看一个有问题的代码:. 在以上这个例子中,访问一个不存在的变量,在这种情况下,程序会怎么处理. 很早以前的处理方式就是程序直接崩溃死掉,所以我们不能容忍这种处理方式,需要有办法来处理.

JVM中的异常处理

- - BlogJava-首页技术区
欢迎来到“ Under The Hood”第六期. 本期我们介绍 JVM处理异常的方式,包括如何抛出和捕获异常及相关的字节码指令. 但本文不会讨论finally子句,这是下期的主题. 你可能需要阅读 往期的文章才能更好的理解本文. 在程序运行时,异常让你可以平滑的处理意外状况. 为了演示JVM处理异常的方式,考虑NitPickyMath类,它提供对整数进行加,减,乘,除以及取余的操作.

spring3.0异常处理进阶

- - Web前端 - ITeye博客
spring3.0开发不可避免要遇到异常处理,如果只有jsp请求能捕获到异常,是不足够的, 有时候AJAX返回json数据时遇到异常. 这时候默认的处理方式不能满足了, 需要自定义的方式支持同步和ajax异步异常处理.  或许大家都知道spring3的异常处理方法有:. 1   以配置文件的方式进行异常管理.

异常处理的最佳实践

- - 博客 - 伯乐在线
译者注:这是一篇2003年的文章,因为时间久远,可能有些观点已经过时,但里面讨论的大部分方法如今仍能适用. 如若有其他好的错误处理的方法,欢迎留言. 异常处理的关键就在于知道何时处理异常以及如何使用异常. 这篇文章,我会提到一些最佳的异常处理方法. 我也会总结checked exception的用法.

Java异常处理的陋习展播

- - 博客 - 伯乐在线
注:本文来自志军(@ _Zhijun )在微博推荐的一篇转载于2007年09月27的旧文,他说“没法找到原作者”. 的确,我也花了半个多小时在找原作者. 先是找到了一个标注“2005年6月18日转字Java研究组织”的文章(“Java研究组织”的域名已过期),后来找到是大连理工大学碧海青天BBS上一个发于的2003年5月中旬的 合集帖子,其中提到一条来自 CSDN 的链接,可惜该链接已挂,否则应该能找到作者的.