在一项目中使用C3P0作为 Hibernate的连接池,在调用一Oracle存储过程中存在自定义对象作为输出参数时出现错误。
java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyCallableStatement cannot be cast to oracle.jdbc.OracleCallableStatement
在网上查了一下,好像都不行,建议使用别的数据源,但测试了proxool和weblogic也都不行,错误基本一样,使用hibernate自带连接池和JDBC直连就可以。
最后经测试,解决方案如下:
过程如下:
PROCEDURE check_test(a IN varchar2,
b IN varchar2,
return_msg OUT return_msg_type);
首先要把return_msg_type,定义为方案对象的自定义类型,不能做为包里的处定义类型。
String procedure = "{call pg_test.check_test(?,?,?)}";
CallableStatement cs;
try {
cs = con.prepareCall(procedure);
cs.setString(1, a);
cs.setBigDecimal(2, b);
cs.registerOutParameter(3,OracleTypes.ARRAY,"RETURN_MSG_TYPE");
cs.execute();
String[] strs=(String[])(cs.getArray(3).getArray());
} catch (SQLException e) {
e.printStackTrace();
throw new BusinessException(e.getMessage());
}