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

Database 如何在Oracle数据库中使用camel SQL组件插入blob,database,apache-camel,jdbctemplate,camel-sql,Database,Apache Camel,Jdbctemplate,Camel Sql,我正在尝试使用camel-SQL组件()插入输入流 我在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 (#

我正在尝试使用camel-SQL组件()插入输入流

我在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>
我总是得到一种不兼容的第三个参数(输入流)

同样的代码在MySQL数据库上运行时没有错误,但在Oracle上运行得不好

我看到组件camel SQL使用以下代码作为使用prepared语句的策略:

// 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上工作得不太好


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

非常感谢您的评论

我刚刚找到了一个解决方案:

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

如果参数值是基于InputStream的,那么spring jdbc是否支持使用setBinaryStream,这对spring jdbc来说更是一个问题。您可以尝试将该输入流包装在SqlParameterValue类中,并将该类型指定为CLOB,那么spring应该使用该信息。
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} );