• Oracle 异常处理


    1、什么是异常?

      答:异常就是程序在运行的时候发生的错误!简称运行时错误。发生异常后,语句停止执行,控制权转移到异常处理部分。

        有些异常是可预见的,例如除数不能为零,但有些异常是不可预见的,例如空指针。

        一个好的程序应该要有异常处理,即对程序运行时发生的错误进行捕捉和处理。

    2、异常分类

      异常分为预定义异常,非预定义异常,用户自定义异常。

      预定义异常:当PL/SQL程序违反Oracle规则或超越系统限制时隐式引发,有PL/SQL为其声明的预定义名字。eg:no_data_found

            如:select ... into ...只能返回一条记录,当返回多条时将导致异常

      非预定义异常:当PL/SQL程序违反Oracle规则或超越系统限制时隐式引发,无PL/SQL为其声明的预定义名字。

      用户自定义异常:需要用户在程序中定义异常变量,显式地在程序中引发。(用户规定程序不能做什么,如年龄不会大于1000岁)

    3、预定义异常语法及使用

      begin

        过程及SQL语句;

      exception

        when 异常名称 then

          过程及sql语句;

        when others then

          过程及SQL语句;

      end;

      使用Oracle数据库的测试用户scott 下的emp表测试:

        DECLARE
           v_ename emp.ename%TYPE;
        BEGIN
           SELECT ename INTO v_ename FROM emp
           WHERE ename = '1111';
           dbms_output.put_line('雇员姓名'||v_ename);
        EXCEPTION
             WHEN no_data_found THEN
             dbms_output.put_line('雇员姓名不存在');
             WHEN OTHERS THEN  --发生其他异常
             dbms_output.put_line('错误号'||Sqlcode||'错误名称'||SQLERRM);
        END;

    4、非预定义异常语法及使用

      非预定义异常比预定义异常多了一个声明部分,即声明异常变量:

      declare

        <异常情况> exception;

        pragma exception_init(<异常情况>,<错误代码>);

      begin

        过程及SQL语句;

      exception

        when 异常名称 then

          过程及sql语句;

        when others then

          过程及SQL语句;

      end;

      预定义异常v_identity 违反主键约束,如员工表的部门编号参照部门表的编号,如果部门表没有部门编号为11这个部门,

      这时候员工表将不能更新任何记录的部门编号为11。

      DECLARE
        v_identity EXCEPTION;
        PRAGMA EXCEPTION_INIT(v_identity,-2291);
      BEGIN
        UPDATE emp SET deptno='11';
      EXCEPTION
        WHEN v_identity THEN
          dbms_output.put_line('部门不存在');
      END;

    5、用户自定义异常语法及使用

      declare

        temp_ex exception;

      begin

        raise temp_ex;

      exception

        when temp_ex then

        ......

      end;

      如雇员编号为7369的雇员没有补助,当查询该补助时将会返回空值:

        DECLARE
            v_comm emp.comm%TYPE;
            comm_is_null EXCEPTION;
        BEGIN
          SELECT comm INTO v_comm FROM emp WHERE empno=7369;
          IF v_comm IS NULL THEN
            RAISE comm_is_null;
          END IF;
            dbms_output.put_line('雇员补助为:'||v_comm);
        EXCEPTION
           WHEN no_data_found THEN
              dbms_output.put_line('没有找到数据');
             WHEN comm_is_null THEN
              dbms_output.put_line('该雇员没有补助');
             WHEN OTHERS THEN
                dbms_output.put_line('发生其他异常');
        END;
    6、raise_application_error(显示引发异常)

      --创建子程序
      CREATE OR REPLACE PROCEDURE status(pre_date DATE,act_date DATE)
      AS
      BEGIN
          IF pre_date<act_date THEN --如果预定时间小于实际时间
             raise_application_error(-20001,'已经过期了');
          END IF;
      END;

      --调用子程序
      DECLARE
        time_is_out EXCEPTION;
        PRAGMA EXCEPTION_INIT(time_is_out,-20001);
      BEGIN
        status(to_date('2014-9-5','YYYY-MM-dd'),to_date('2014-9-23','YYYY-MM-dd'));
      EXCEPTION
        WHEN time_is_out THEN
          dbms_output.put_line(to_char(SQLERRM(-20001)));
      END;

  • 相关阅读:
    homebrew 安装 mpv
    Spring JdbcTemplate 两种方法的区别
    git .gitignore失效的解决办法
    git 分支修改bug应用场景
    url编码实践
    escape encodeuri encodeURIComponent 区别
    mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by
    服务器病毒问题解决- 阿里云 挖矿病毒,Circle_MI.png
    trim和replace的陷阱实践
    mysql 5.7.15 union order by 子查询排序不生效
  • 原文地址:https://www.cnblogs.com/wdlove/p/3987793.html
Copyright © 2020-2023  润新知