错误处理
在运行程序时出现的错误叫做异常,发生异常后,语句将停止执行,控制权转移到 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