首先在PL/SQL中,建立一個存儲過程以下:java
PROCEDURE p_test_say_hello(in_name IN VARCHAR2, out_hello OUT VARCHAR2, out_code OUT NUMBER, out_msg OUT VARCHAR2) IS BEGIN out_code := -1; out_msg := 'ok'; SELECT 'hello ,' + in_name--這個地方故意寫錯,應該使用"||" INTO out_hello FROM dual; EXCEPTION WHEN OTHERS THEN out_code := -1;--之前根據這個標識來判斷過程是否執行成功 out_msg := 'p_test_say_hello:' || SQLERRM; RAISE;--用於拋出異常 END;
Mybatis映射文件(Mapper.xml)程序以下:sql
<select id="test" statementType="CALLABLE" parameterType="java.util.HashMap"> <![CDATA[ {CALL pkg_test.p_test_say_hello (#{in_name, mode=IN,jdbcType=VARCHAR}, #{out_hello, mode=IN,jdbcType=VARCHAR}, #{out_code, mode=OUT,jdbcType=INTEGER}, #{out_msg, mode=OUT,jdbcType=VARCHAR})} ]]> </select>
Mybatis映射接口(Mapper.java)app
//必定要拋出異常 List<Map<String, Object>> test(Map<String, Object> inMap) throws Exception;
Service中的示例代碼:測試
public List<Map<String, Object>> test(Map<String, Object> inMap) { try { inMap.put("in_name", "hanson"); inMap.put("out_hello", ""); inMap.put("out_msg", ""); inMap.put("out_code", 0); return this.userSchemeDao.test(inMap); } catch (Exception e) { throw new RuntimeException("存儲過程執行報錯,報錯信息如",e); } }
測試調用控制檯結果:this
Caused by: java.lang.RuntimeException: 存儲過程執行報錯,報錯信息如: ### Error querying database. Cause: java.sql.SQLException: ORA-01722: 無效數字 ORA-06512: 在 "EEOS_CM.PKG_CM_PROMOTIONS", line 402 ORA-06512: 在 line 1
結論:按照測試狀況是可以撲捉到錯誤信息的code