如何使用camel SQL组件在Oracle数据库中插入blob

时间:2015-12-30 13:35:06

标签: database apache-camel jdbctemplate camel-sql

我正在尝试使用camel SQL组件(http://camel.apache.org/sql-component.html)插入输入流。

我在Oracle数据库中有以下表格:

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});

我总是得到一种不兼容的第三个参数(输入流)。

相同的代码在MySQL数据库上运行时没有错误,但在Oracle上运行不正常。

我看到组件camel 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);

但是这个策略似乎没有使用prepare语句如下:

ps.setBinaryStream(3,inputStream,length);

但是请调用以下代码

ps.setObject(paramIndex, inputStream);

它似乎在oracle db上运行得不好。

所以问题是:我会更改SQL camel组件使用的默认SQL预准备语句策略吗?或者还有其他方法吗?

1 个答案:

答案 0 :(得分: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} );