オブジェクト(オラクル)のコレクションであるパラメータを含むプロシージャを実行しようとしています。私は春なしで何度もそれらを管理しましたが、インターネット上にいくつかの情報がありますが、私のコードを比較するための完全な例を見つけることができません。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 Arrays を使用している場合、接続を Oracle 接続にキャストする必要があるように思えることがわかりました。
ただし、SimpleJDBCTemplate や StoredProcedure などのほとんどの Spring jdbc フレームワーク クラスは、接続アクセスを隠します。これらのいずれかをサブクラス化し、どこかでメソッドをオーバーライドして dbcp 接続を取得し、それを Oracle 接続にキャストする必要がありますか?
どうもありがとうございました。