1

camel SQL コンポーネント ( http://camel.apache.org/sql-component.html )を使用して入力ストリームを挿入しようとしています。

Oracle Databaseに次の表があります。

table EMPLOYEE(NAME varchar(32) ,SURNAME varchar(32)  , PIC BLOB );

そして次のルート:

 <route>
   <from uri="direct:startOracle" />
    <to uri="sql:INSERT INTO EMPLOYEE (Name, surname, pics) VALUES (# , # , #)?dataSource=#oracle" />
</route>

次のコードを実行しようとすると:

Resource r = contex.getResource("classpath:file/ciao.jpg");
InputStream inputStream = r.getInputStream();   
aProducerTemplate.sendBody(new Object[] {"mario", "ross", inputStream});

私は常に種類の互換性のない 3 番目のパラメーター (入力ストリーム) を取得します。

MySQL データベースでは同じコードがエラーなしで実行されますが、Oracle ではうまく動作しません。

コンポーネントのキャメル SQL が、準備済みステートメントを使用するための戦略として次のコードを使用していることがわかりました。

// use argument setter as it deals with various JDBC drivers setObject vs setLong/setInteger/setString etc.
ArgumentPreparedStatementSetter setter = new ArgumentPreparedStatementSetter(args);
setter.setValues(ps);

しかし、この戦略は次のように準備ステートメントを使用していないようです:

ps.setBinaryStream(3,inputStream,length);

代わりに次のコードを呼び出します

ps.setObject(paramIndex, inputStream);

Oracle dbではうまく機能しないようです。

問題は、SQL camel コンポーネントで使用されているデフォルトの SQL プリペアド ステートメント戦略を変更するかどうかです。それとも他の方法がありますか?

4

1 に答える 1

1

コメントありがとうございます。

私はちょうど解決策を見つけました:

Resource r = contex.getResource("classpath:file/ciao.jpg");
InputStream inputStream = r.getInputStream();
SqlLobValue blobVal = new SqlLobValue(inputStream, (int) r.getFile().length() );
SqlParameterValue blob = new SqlParameterValue(Types.BLOB,"BLOB", blobVal );
aProducerTemplate.sendBody(new Object[] {"Mario", "Rossi",blob} );
于 2016-01-05T17:02:45.303 に答える