zoukankan      html  css  js  c++  java
  • mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析

    首先根据这篇文章:http://www.cnblogs.com/coolzdp/p/7717332.html

    我们知道存储过程中 SELECT * INTO 如果没有记录是不会往下执行的,直接抛出NO_DATA_FOUND异常,

    这个在plsql developer中直接测试执行没问题,会报ORA-1403异常。

    但是在mybatis中调用的话就不会抛出NO_DATA_FOUND异常而是在select * into语句为空时默默的终止执行该过程

    在服务层采用事务处理的话就有问题了,服务层调用 select * into为空的存储过程处理逻辑肯定是有毛病的,本来应该抛出异常扔给控制器层,

    现在只是终止了,后面的语句还会执行,这样就不对了。

    我猜测是mybatis针对NO_DATA_FOUND异常做了过滤,捕获后不再抛出了

    我的处理方法就是如果有select into, 在plsql过程最后手动捕获NO_DATA_FOUND异常,抛出自定义异常

    EXCEPTION
      WHEN NO_DATA_FOUND THEN
      raise_application_error('-20000', 'select into没找到数据');

    如果是那种需要提示给用户指出select into必须有记录的原因那么就老老实实的用下面的语句吧:

    SELECT COUNT(*) INTO v_playVoyageCount FROM PLAN_VOYAGE 
         WHERE VESSEL_ID_ = p_vesselId AND SAILING_DATE_ = to_date(p_sailDate, 'yyyy-mm-dd');
      IF v_playVoyageCount = 0
      THEN
          raise_application_error(-20000, 'no record');
      END IF;

    参考这篇文章:https://www.cnblogs.com/zhangxsh/p/3494340.html

    实际上这篇文章并不是针对mybatis中调用存储过程不报NO_DATA_FOUND异常,而是针对

    在 select fn_test('1') from dual; SQL中调用函数返回null终止而不抛NO_DATA_FOUND异常。

    区别是这个是oracle自身的处理,上面的是mybatis的处理。

  • 相关阅读:
    Python GUI编程实例
    Python MySQL事务、引擎、索引及第三方库sqlalchemy
    Python 魔法方法简介
    Python sax模块(SAX解析XML)
    Python minidom模块(DOM写入和解析XML)
    【LOJ】#2432. 「POI2014」代理商 Couriers
    【51nod】1559 车和矩形
    【LOJ】#2430. 「POI2014」沙拉餐厅 Salad Bar
    【LOJ】#2105. 「TJOI2015」概率论
    【BZOJ】1336: [Balkan2002]Alien最小圆覆盖
  • 原文地址:https://www.cnblogs.com/coolzdp/p/7873323.html
Copyright © 2011-2022 走看看