源码-Oracle数据库管理-第十六章-异常处理机制-Part 1(理解异常处理)

异常是指:

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值