1

オブジェクト(オラクル)のコレクションであるパラメータを含むプロシージャを実行しようとしています。私は春なしで何度もそれらを管理しましたが、インターネット上にいくつかの情報がありますが、私のコードを比較するための完全な例を見つけることができません。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 接続にキャストする必要がありますか?

どうもありがとうございました。

4

2 に答える 2

1

最終的に解決しました。この問題を解決するためのコードを探している人のための例を示すために、投稿を編集しました。

心に留めておくべき重要な点が 2 つあります。

1) Oracle 機能を取得するための接続を適切にキャストするには、jdbctemplate で Oracle エクストラクタを設定する必要があります。

2) このエクストラクタ ojdbc を使用する場合、JRE のバージョンは同じでなければなりません。それ以外の場合は、abstractmethodinvocation 例外が発生します。

それを解決しようとした人に感謝し、それが役立つことを願っています.

于 2012-08-23T08:50:54.727 に答える