首先根據這篇文章: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的處理。