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