2015-12-30 51 views
1

我想使用駱駝SQL組件(http://camel.apache.org/sql-component.html)插入輸入流。如何在Oracle數據庫中使用駱駝SQL組件插入blob

我在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上運行不正常。

我看到組件駱駝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); 

,它似乎並不活像k在oracle db上很好。

所以問題是:我會更改SQL駝峯組件使用的默認SQL準備語句策略嗎?或者還有其他方法嗎?

+0

它更多的去春來JDBC如果如果參數值是基於爲InputStream等 –

+1

你可以嘗試換行輸入流中的SqlParameterValue他們可以支持使用的setBinaryStream問題類並將類型指定爲CLOB,那麼spring應該使用該信息。 –

回答

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