天天看點

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異常處理分析