异常是指:
1. PL/SQL中产生的警告或错误,比如错误的除零操作或内存溢出
2. 用户根据上下文业务逻辑定义的异常
--16.1 理解异常处理
--16.1.1 异常处理简介
--代码16.1 运行时PL/SQL被零除异常
DECLARE
x NUMBER:=&x; --使用替换变量,让用户输入除数
y NUMBER:=&y; --使用替换变量,让用户输入被除数
z NUMBER; --保存运算结果的变量
BEGIN
z:=x+y; --2个数相加
DBMS_OUTPUT.PUT_LINE('x+y='||z);
z:=x/y; --2个数相除
DBMS_OUTPUT.PUT_LINE('x/y='||z);
END;
--代码16.2 使用异常处理机制处理被零除异常
DECLARE
x NUMBER:=&x; --使用替换变量,让用户输入除数
y NUMBER:=&y; --使用替换变量,让用户输入被除数
z NUMBER; --保存运算结果的变量
BEGIN
z:=x+y; --2个数相加
DBMS_OUTPUT.PUT_LINE('x+y='||z);
z:=x/y; --2个数相除
DBMS_OUTPUT.PUT_LINE('x/y='||z);
EXCEPTION --异常处理语句块
WHEN ZERO_DIVIDE THEN --处理被0除异常
DBMS_OUTPUT.PUT_LINE('被除数不能为0');
WHEN OTHERS THEN --处理所有未捕获的异常
DBMS_OUTPUT.PUT_LINE('应用程序出现了错误');
END;
--16.1.2 异常处理语法
--代码16.3 异常处理结构示例
DECLARE
e_duplicate_name EXCEPTION; --定义异常
v_ename emp.ename%TYPE; --保存姓名的变量
v_newname emp.ename%TYPE := '史密斯'; --新插入的员工名称
BEGIN
--查询员工编号为7369的姓名
SELECT ename
INTO v_ename
FROM emp
WHERE empno = 7369;
--确保插入的姓名没有重复
IF v_ename = v_newname
THEN
RAISE e_duplicate_name; --如果产生异常,触发e_duplicate_name异常
END IF;
--如果没有异常,则执行插入语句
INSERT INTO emp
VALUES (7881, v_newname, '职员', NULL, TRUNC (SYSDATE), 2000, 200, 20);
EXCEPTION --异常处理语句块
WHEN e_duplicate_name THEN
DBMS_OUTPUT.put_line ('不能插入重复的员工名称');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('异常编码:'||SQLCODE||' 异常信息:'||SQLERRM);
END;
select * from emp where empno=7369;
--16.1.3 预定义异常
--代码16.4 使用预定义异常
DECLARE
v_ename emp.ename%TYPE; --定义一个保存员工名称的变量
BEGIN
--在这里故意制造了一个NO_DATA_FOUND错误,查询一个并不存在的员工编号
SELECT ename INTO v_ename FROM emp WHERE empno=19999;
EXCEPTION
WHEN NO_DATA_FOUND -- 捕捉NO_DATA_FOUND错误
THEN
DBMS_OUTPUT.put_line ( '出现了NO_DATA_FOUND异常'
|| ' 错误编号:'
|| SQLCODE
|| ' 错误名称:'
|| SQLERRM
); --显示错误编号和错误消息
END;