我试图执行一个过程,该过程在其他过程中包含一个参数,该参数是对象(oracle)的集合。我已经在没有 spring 的情况下管理了很多次,但是我在尝试使用 spring 时有点迷失,尽管互联网上有一些信息,但我找不到完整的示例来比较我的代码。Spring doc 只有片段。可能我的代码是错误的,但我忽略了为什么,你能帮我吗?我正在运行更简单的程序而没有问题。我的 DAO 看起来像这样:
//[EDITED]
private SimpleJdbcCall pActualizaDia;
....
@Autowired
public void setDataSource(DataSource dataSource) {
pActualizaDia = new SimpleJdbcCall(dataSource).withCatalogName("PTR_GRUPOS_TRABAJO").withProcedureName("UPDATE_DIA");
pActualizaDia.getJdbcTemplate().setNativeJdbcExtractor(new OracleJdbc4NativeJdbcExtractor());
}
...
public Calendario updateSingle(final Calendario calendario) {
SqlTypeValue cambiosEmpresa = new AbstractSqlTypeValue() {
protected Object createTypeValue(Connection conn, int sqlType, String typeName) throws SQLException {
ArrayDescriptor arrayDescriptor = new ArrayDescriptor("TTPTR_CAMBIO_EMPRESA", conn);
Object[] collection = new Object[calendario.getCambiosEmpresa().size()];
int i = 0;
for (CeAnoEmp ce : calendario.getCambiosEmpresa()) {
collection[i++] = new STRUCT(new StructDescriptor("TPTR_CAMBIO_EMPRESA", conn), conn, new Object[] {
ce.getSQLParam1(),
//...more parameters here in order to fit your type.
ce.getSQLparamn() });
}
ARRAY idArray = new ARRAY(arrayDescriptor, conn, collection);
return idArray;
}
};
MapSqlParameterSource mapIn = new MapSqlParameterSource();
mapIn.addValue("P_ID_ESCALA", calendario.getEscala().getIdEscala());
//more simple params here
//Here it is the Oracle ARRAY working properly
pActualizaDia.declareParameters(new SqlParameter("P_CAMBIOS_EMPRESA",
OracleTypes.STRUCT, "TTPR_CAMBIO_EMPRESA"));
mapIn.addValue("P_CAMBIOS_EMPRESA",cambiosEmpresa);
//When executing the procedure it just work :)
pActualizaDia.execute(mapIn);
return null;
}
我得到的例外是
java.lang.ClassCastException: $Proxy91 cannot be cast to oracle.jdbc.OracleConnection
我一直在阅读有关此主题的更多信息,我发现如果使用 Oracle 阵列,您似乎还必须将连接强制转换为 oracle 连接。
但是,大多数 Spring jdbc 框架类(如 SimpleJDBCTemplate 和 StoredProcedure)对您隐藏了连接访问。我是否需要对其中一个进行子类化并在某处覆盖一个方法以获取 dbcp 连接,然后将其转换为 Oracle 连接?
非常感谢你。