欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » Oracle数据库应用教程 » 正文

Oracle学习教程之错误处理

创建时间:2012年04月05日 15:06  阅读次数:(4190)
分享到:

错误处理


在运行程序时出现的错误叫做异常,发生异常后,语句将停止执行,控制权转移到 PL/SQL 块的异常处理部分。
异常有两种类型:
1,预定义异常 -  当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发
2,用户定义异常  -  用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发

处理预定义异常示例:
DECLARE 
  emprnum emp.empno%type;
BEGIN
  SELECT empno INTO empnum FROM emp;
EXCEPTION 
  WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE ('返回多行');
END;


预定义的异常
预定义异常名 描述
ACCESS_INTO_NULL 试图给一个没有初始化的对象赋值
CURSOR_ALREADY_OPEN 试图打开一个已经打开的游标
DUP_VAL_ON_INDEX 试图在一个有惟一性约束的字段中存储重复的值
NVALID_CURSOR 试图执行一个无效的游标
LOGIN_DENIED 用一个无效的用户名或口令登录
NO_DATA_FOUND 查询语句没有返回数据
NOT_LOGGED_ON 连接数据库失败
SUBSCRIPT_OUTSIDE_LIMIT 表或数组类型变量中索引值超出系统范围
SUBSCRIPT_BEYOND_COUNT 表或数组类型变量中索引值超出系统范围
TOO_MANY_ROWS 查询语句返回多行数据
VALUE_ERROR 变量转换时形成无效值
ZERO_DIVIDE 被零除


处理用户定义异常
自定义异常处理先定义,后触发,再处理。
 1.定义异常处理 
<异常处理名 >   EXCEPTION; 
异常处理名是用户定义的,EXCEPTION 是异常处理关键字。 
2.触发异常处理 
在 PL/SQL 程序块的执行部分可能出现异常处,写触发语句捕获异常,触发异常处理的语句格式如下: 
RAISE <异常处理名 >;
3.处理异常 
一个 PL/SQL 程序块中可以包含多个异常处理,根据不同的异常处理名来执行不同的异常处理程序。在 PL/SQL 程序块的 EXCEPTION 中编写异常处理程序,定义异常处理程序的方法如下:
EXCEPTION WHEN    <异常处理名 1 >    THEN 
<异常处理语句序列 1 >; 
…… 
WHEN    <异常处理名 n >    THEN                
 <异常处理语句序列 n >;

示例:

DECLARE 
  invalidDEPT EXCEPTION;
  v_dept VARCHAR2(10);
BEGIN
 v_dept := '&dept';
  IF v_dept NOT IN ('10','20','30','40')THEN
    RAISE invalidDEPT;
  ELSE
    DBMS_OUTPUT.PUT_LINE('您输入的部门是'|| v_dept);
  END IF;
EXCEPTION
  WHEN invalidDEPT THEN
    DBMS_OUTPUT.PUT_LINE('没有该部门');
END;


引发应用程序异常
RAISE_Application_ERROR 过程
1,用于创建用户定义的错误信息
2,可以在可执行部分和异常处理部分使用
3,错误编号必须介于 –20000 和 –20999 之间
4,错误消息的长度可长达 2048 个字节

引发应用程序错误的语法:
RAISE_Application_ERROR(error_number, error_message);

引发应用程序异常
RAISE_Application_ERROR创建用户定义的错误消息,用户定义的错误消息可以更详细地描述异常。引发应用程序错误地语法如下:
RAISE_Application_ERROR(error_number,error_message);

error_number:表示用户为异常指定的编号,该编号介于-20000和-20999之间的负整数。
Error_message:表示用户为异常指定的消息文本。长度可达到2048个字节。错误消息是与error_number关联的文本。

RAISE_Application_ERROR可以在可执行部分和异常处理部分使用。在调用该过程时,同时显示错误编号和信息。

例:当薪水为空时引发异常,将显示“工资异常”。
SQL >SET SERVEROUTPUT ON
SQL > DECLARE
   sal_v emp.sal%type;
   sal_exception exception;
   BEGIN
   SELECT NVL(sal,0) INTO sal_v FROM emp WHERE empno=&empno;
   If sal_v=0 THEN
   Raise sal_exception;
   ELSE
   DBMS_OUTPUT.PUT_LINE('此员工薪水为:'||sal_v);
  END IF;
  EXCEPTION
  WHEN sal_exception THEN
  RAISE_Application_ERROR(-20001,'工资异常');
  END;


小结:
PL/SQL 是一种可移植的高性能事务处理语言
PL/SQL引擎驻留在 Oracle 服务器中
PL/SQL 块由声明部分、可执行部分和异常处理部分组成
PL/SQL 数据类型包括标量数据类型、LOB 数据类型和属性类型
控制结构包括条件控制、循环控制和顺序控制 
PL/SQL 支持动态 SQL
游标用于处理查询结果集中的数据
游标类型有:隐式游标、显式游标和 REF 游标
隐式游标由 PL/SQL 自动定义、打开和关闭
显式游标用于处理返回多行的查询
显式游标可以删除和更新活动集中的行
要处理结果集中所有记录时,可使用循环游标
REF 游标运行的时候动态决定执行何种查询
运行时出现的错误叫做异常
异常可以分为预定义异常和用户定义的异常p
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 92+86=? 的结果(结果是:178)
结  果: