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的處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM