Mybatis如何捕捉存储过程抛出的异常

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