• 从零开始学Oracle—异常处理(八)


          异常处理 
    一、异常
      (1) 程序错误
        - 编译时
        - 运行时
      (2)异常
        - 处理运行时错误

    .PL/SQL是如何处理异常的?
      -  错误引发异常
      -  每当引发异常时,都将控制权传递给异常处理程序
      -  异常处理程序处理异常

    .异常中涉及的步骤
       -  声明异常
       -  引发异常
       -  处理异常

    .异常的类型
       -  预定义的异常   --由Oracle服务器维护异常
       -  非预定义的异常 又称'用户定义异常'


    1、预定义异常
      由Oracle为常见错误预定义
      在DBMS_Standard程序包中提供了这些定义
      不需要显式声明
    declare
       empJob emp.job%type;
    begin
      select job into empjob from emp where empno=0000;
      DBMS_output.put_line('Employee job is '||emjob);
    Exception
      when No_data_found then
         DBMS_output.put_line('错误了,查询没有返回行');
      when too_many_rows then
         DBMS_output.put_line('错误了,查询返回了多条数据');
      when zero_divide  then
         DBMS_output.put_line('错误了,除数不能为零');
      when others then  --一定是最后一个处理的代码
          DBMS_output.put_line('错误了,未知的错误信息');
    end;

    2、非预定义异常
       无法预知的错误,如网络不通、服务没有启动、或其他错误,这样的异常需要用户要定义
    declare
       PK_conflict Exception;  --用户定义异常
       iCount int:=0;
    begin
       select count(*) into iCount from emp where empno='7369'
       if iCount>0 then
           raise   Dup_Value;  --引发异常
       end if;
    Exception
        when PK_conflict  then   --处理异常
          DBMS_output.put_line('表中已经有这条记录了');
    end;
    /
    以上代码的问题是,只有条件满足 才会引发异常,否则永远都不会执行此句.
    并且当有多个语句都有可能会引发此异常时,代码就过于冗余.并且都要显示
    的引发异常,能不能让系统帮我们维护自定义异常了,当有异常引发时 自动
    通知Oracle服务器处理异常

    pragma指令
    declare
       PK_conflict Exception;  --用户定义异常
       pragma  Exception_init(PK_conflict -1);  --编译指令 可以把异常捆绑到Oracle 并覆盖预定义的异常 
       iCount int:=0;                                     这里的-1 代表主键冲突
    begin
       insert into emp(empno,ename) values('7369','FeiYang');
    Exception
        when PK_conflict then   --处理异常
          DBMS_output.put_line('表中已经有这条记录了,主键冲突');
    end;

    为了给用户友好的错误提示.用此函数可以定义友好的提示。
    DBMS_output.put_line()函数只有sqlPlus 客户端支持.
    Raise_Application_Error 
      .用于创建用户定义的错误消息的过程
      .可以再执行部分和异常部分使用
      .必须介于 -20000 和 -20999之间
      .可以存储2M的错误信息
    declare
       PK_conflict Exception;  --用户定义异常
       pragma  Exception_init(PK_conflict -1);  --编译指令
       iCount int:=0;
    begin
       insert into emp(empno,ename) values('7369','FeiYang');
    Exception
        when PK_conflict then   --处理异常
          Raise_Application_Error(-20001,'表中已经有这条记录了'); --注意参数的前后顺序
    end;
    常见系统异常参考表:

    Code
  • 相关阅读:
    CentOS 7 修改国内yum源
    k8s 安装
    python2 python3同时安装了scrapy如何区分调用
    scrapy log 设置
    hello django
    linux 分割大文件
    scrapy 对不同的Item进行分开存储
    纯C实现的一套low b 贪吃蛇(娱乐版)
    Python之如何实现一行输入多个值
    HDU2571:命运(DP)
  • 原文地址:https://www.cnblogs.com/sunjie9606/p/2167414.html
Copyright © 2020-2023  润新知