zoukankan      html  css  js  c++  java
  • oracle存储过程的异常写法

    oracle存储过程—-异常介绍
      参考PL/SQL ,存储过程中的异常来自于程序本身,也有的来自开发人员自定义的数据,而所有的这些错误我们称之为异常(编译时的错误不能称为异常)。
    本篇介绍存储过程中对于异常的三种分类:

    1.预定义异常。
    2.非预定义异常。
    3.自定义异常。


    1、预定义异常
      oracle中为每个错误提供了一个错误号,而捕获异常则需要异常有名称,oracle提供了一些已经定义好名称的异常,这就是预定义异常。oracle一共提供了25种预定义异常。
      想要查看oracle预定义异常,输入下边的命令:

    SELECT * FROM DBA_SOURCE WHERE NAME='STANDARD' AND TEXT LIKE '%EXCEPTION_INIT%'

    则会看到如下的结果,即所有的预定义异常:

     预定义异常的捕获,只要名字与上图中的TEXT 里的 括号中字母下划线那部分,匹配一致即可。
    比如如下:

    create or replace procedure test_select_procedure
    AS
    v_ds ly_ds%rowtype;
    BEGIN
       select * into v_ds from ly_ds;
       EXCEPTION  -- 由EXCEPTION开始
          WHEN TOO_MANY_ROWS THEN  --如果符合这个异常,则进入下边的执行
          DBMS_OUTPUT.PUT_LINE('返回结果超过一条');
    END;

    上边的查询结果,返回多条记录,即符合了预定义异常中的TOO_MANY_ROWS ,则会进入该异常中的逻辑。
      异常的匹配从上而下,这一点注意。

    2、非预定义异常

      oracle更多的是非预定异常。有些异常是只有错误编号和相关的错误描述,并没有名称,为了解决这一问题,oracle允许开发人员为这样的异常添加一个名称,使得它们能够被异常处理模块捕捉到。
      比如像下边的这个异常,ORA-12899,就是这种情况:

    ORA-12899: 列 "ZNXD_GATEWAY"."LY_DS"."CREATE_TIME" 的值太大 (实际值: 149, 最大值: 50)

    它没有对应的异常名称,不属于预定义异常。

      解决办法就是,只需要将它的错误号码,与异常名称关联一下即可,例子写法如下:

    create or replace procedure test_add_procedure
    (id varchar,createtime varchar,name varchar,
    age varchar,sex varchar)
    AS
    my_12899_exp exception; --定义一个异常,取名为my_12899_exp
    --编译当前异常名,并与错误号对应
    pragma exception_init(my_12899_exp,-12899); 
    BEGIN
    insert into ly_ds values(id,createtime,name,age,sex);
    exception
      when dup_val_on_index then --不符合当前异常则继续匹配边的
      dbms_output.put_line('主键冲突');
      when my_12899_exp then  --符合该异常则进入执行
     dbms_output.put_line('内容超出存储范围');
    end;

    执行如下,当把第二个字段的值设的超出存储范围后,会引发异常:

    SET SERVEROUTPUT ON;
    BEGIN
    test_add_procedure('11','2018-09-081辅导费地方发地方的分担分担放到发地方地方','刘七','30','');
    END;

    输出结果如下:

    内容超出存储范围

    3、自定义异常
      如果有些并不属于系统错误,可能是因为某段业务逻辑,只是想让它抛出异常,像这种主动抛出异常的情况,就需要自定义异常了。
      异常都会有错误名称和错误号,自定义异常的时候,可以使用-20999~-20000 这个范围的数字作为错误号,不会引起冲突的。
      如下,数据库的内容:

    想要写一个,根据性别,匹配条数,如果大于一条,则抛出异常,这样的存储过程,如下:

    create or replace procedure test_select2_procedure
    (sex  varchar)
    AS
    countNum number(10); 
    my_range_exp exception;  --声明一个异常,取名为my_range_exp
    pragma exception_init(my_range_exp,-20001); --编译异常
    BEGIN
        select count(*) into countNum from ly_ds where LY_NB=sex;
        if(countNum >1) then
            raise my_range_exp; --使用raise抛出异常
        end if;
        dbms_output.put_line(countNum);
        exception
            when my_range_exp then
            dbms_output.put_line('查询条数大于1,主动抛出异常');
    END;

    当分别传入 、 两种参数时,结果如下:
      执行 :

    BEGIN
    test_select2_procedure('');
    END;

    结果

    1

    执行 :

    BEGIN
    test_select2_procedure('');
    END;
    查询条数大于1,主动抛出异常

    原文链接:https://blog.csdn.net/wohaqiyi/article/details/81838236

  • 相关阅读:
    [转发]深入理解git,从研究git目录开始
    iOS系统网络抓包方法
    charles抓包工具
    iOS多线程中performSelector: 和dispatch_time的不同
    IOS Core Animation Advanced Techniques的学习笔记(五)
    IOS Core Animation Advanced Techniques的学习笔记(四)
    IOS Core Animation Advanced Techniques的学习笔记(三)
    IOS Core Animation Advanced Techniques的学习笔记(二)
    IOS Core Animation Advanced Techniques的学习笔记(一)
    VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法
  • 原文地址:https://www.cnblogs.com/thomasbc/p/15656618.html
Copyright © 2011-2022 走看看