• PL/SQL基础-异常处理


    --*********异常处理
    一、异常的类型
    ORACLE异常分为两种类型:系统异常、自定义异常。
    其中系统异常又分为:预定义异常和非预定义异常。
    1.预定义异常
    ORACLE定义了他们的错误编号和异常名字,常见的预定义异常处理Oracle常见的错误

    NO_DATA_FOUND SELECT ... INTO ... 时,没有找到数据
    DUL_VAL_ON_INDEX 试图在一个有惟一性约束的列上存储重复值
    CURSOR_ALREADY_OPEN 试图打开一个已经打开的游标
    TOO_MANY_ROWS SELECT ... INTO ... 时,查询的结果是多值
    ZERO_DIVIDE 零被整除
    2.非预定义异常
    ORACLE为它定义了错误编号,但没有定义异常名字。我们使用的时候,先声名一个异常名,
    通过伪过程PRAGMA EXCEPTION_INIT,将异常名与错误号关联起来。

    3.自定义异常
    程序员从我们业务角度出发,制定的一些规则和限制。
    二、异常处理
    PL/SQL中,异常处理按个步骤进行:
    定义异常
    抛出异常
    捕获及处理异常

    a.定义异常

    exception_name EXCEPTION;



    b.抛出异常

    RAISE exception_name



    c.捕获及处理异常

    EXCEPTION
    WHEN e_name1 [OR e_name2 ... ] THEN
    statements;
    WHEN e_name3 [OR e_name4 ... ] THEN
    statements;
    ......
    WHEN OTHERS THEN
    statements;
    END;


    --使用预定义的异常
    --根据用记输入的商品ID来查商品库存

    DECLARE
    V_ID ES_PRODUCT.ID%TYPE := &V_ID; --用户输入商品ID
    V_STOCKCOUNT ES_PRODUCT.STOCKCOUNT%TYPE; ---库存量
    BEGIN
    SELECT STOCKCOUNT INTO V_STOCKCOUNT FROM ES_PRODUCT WHERE ID = V_ID;
    DBMS_OUTPUT.PUT_LINE('库存量:' || V_STOCKCOUNT);
    --判断库存量是否正常
    IF V_STOCKCOUNT > 0 THEN
    --更新库存,一次买一个减掉一个
    UPDATE ES_PRODUCT
    SET STOCKCOUNT = STOCKCOUNT - 1
    --更新指定的,不然会全部更新
    WHERE ID = V_ID;
    --提出数据操作
    COMMIT;
    DBMS_OUTPUT.PUT_LINE('库存更新成功');
    ELSIF V_STOCKCOUNT = 0 THEN
    DBMS_OUTPUT.PUT_LINE('库存量是0,没有库存了');
    ELSE
    DBMS_OUTPUT.PUT_LINE('库存异常');
    END IF;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('该商品不存在!');
    ROLLBACK;
    WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('该商品存在多个!');
    ROLLBACK;
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('发生了其它错误!');
    ROLLBACK;
    END;


    --自定义异常
    --实现订单删除

    SELECT * FROM ES_ORDER;
    DECLARE
    E_NO_RESULT EXCEPTION;
    V_ID ES_ORDER.ID%TYPE := &ID;
    V_EXCEPTION1 CONSTANT VARCHAR2(50) := '删除数据不成功!';
    V_EXCEPTION2 CONSTANT VARCHAR2(50) := '发生了错误!';
    BEGIN
    DELETE FROM ES_ORDER WHERE ID = V_ID;
    IF (SQL%NOTFOUND) THEN
    --删除没有执行
    RAISE E_NO_RESULT;
    END IF;
    EXCEPTION
    WHEN E_NO_RESULT THEN
    DBMS_OUTPUT.PUT_LINE(V_EXCEPTION1);
    ROLLBACK;
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(V_EXCEPTION2);
    ROLLBACK;
    END;
  • 相关阅读:
    Mac OS X下Maven的安装与配置
    [MAC Eclipse] Eclipse for MAC 中文乱码的解决办法
    The type javax.servlet.http.HttpServletRequest cannot be resolved.
    IOS基础:深入理解Objective-c中@class的含义
    NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化
    真机测试时的错误:No matching provisioning profiles found
    转帖Jmeter中的几个重要测试指标释义
    Spring集成log4j日志管理
    Log4J日志配置详解
    使用Redis的理由
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4205015.html
Copyright © 2020-2023  润新知