mybatis 調用 oracle 預存程序 select into 無記錄時NO_DATA_FOUND異常處理分析

來源:互聯網
上載者:User

標籤:事務   沒有   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異常處理分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.