mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析
Posted 时光飞溅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的处理。
以上是关于mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析的主要内容,如果未能解决你的问题,请参考以下文章
从java调用oracle存储过程时在mybatis mapper中映射多个out参数
mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析