首先在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