標籤:事務 沒有 plain key test 語句 to_date error rac
首先根據這篇文章: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異常處理分析