问题的基本要点是如何获取字符串有效负载并将其转换为CLOB以获取oracle <db:insert ... />
我需要在oracle数据库中写入和读取CLOB数据。将String转换为CLOB的典型方法是执行db.getConnection().createClob()
之类的操作,然后将数据设置为此创建的CLOB。似乎在MULE中,这是一个合法的选项,因为我不会(或至少非平凡地)访问连接对象。 (也许我可以通过创建新连接并在变换器中进行转换来做一些hacky的东西?)
回顾一下文档和以前的版本,从V3.5.x开始,似乎有<jdbc:connector .../>
的旧属性可以处理数据库中的各个行,并为这些行提供自定义处理程序。这个jdbc连接器已被弃用,我希望它将在以后的版本中删除。
那么这是如何工作的?骡子打算怎么做? 如何将字符串转换为CLOB以获取 <db:insert .../>
以下是重现问题的示例流程。
<db:oracle-config name="Oracle" host="localhost" port="1521" instance="testIns" user="myUser" password="myPass" doc:name="Oracle Configuration" />
<flow name="databaseInsertFlow">
<file:inbound-endpoint path="C:\test\input" responseTimeout="10000" doc:name="File"/>
<file:file-to-string-transformer doc:name="File to String"/>
<db:insert config-ref="Oracle_Configuration" doc:name="Database">
<!-- create table tblTest (cdata clob) -->
<db:parameterized-query><![CDATA[insert into tblTest (cdata) values (#[payload])]]></db:parameterized-query>
</db:insert>
</flow>
更新 对问题的进一步审查表明,问题在于使用ojdbc7.jar驱动程序。恢复到ojdbc6.jar使用上述流程解决了问题。
答案 0 :(得分:0)
我确实找到了适用于插件的解决方案*但是这是一个糟糕而丑陋的黑客。
此解决方案是忽略mule提供的数据库连接器并自行滚动。
下面是所需的配置:
<spring:beans>
<spring:bean id="dbInserter" scope="prototype" class="kansas.InsertPayloadClob">
<spring:property name="dbConnection">
<spring:ref local="Oracle_Configuration"/>
</spring:property>
</spring:bean>
</spring:beans>
<flow name="databaseInsertFlow">
<file:inbound-endpoint path="c:\test\input" responseTimeout="10000" doc:name="File"/>
<file:file-to-string-transformer doc:name="File to String"/>
<component doc:name="Java">
<spring-object bean="dbInserter"/>
</component>
</flow>
和一个实际执行数据库插入的简单类
public class InsertPayloadClob implements Callable {
private StaticDbConfigResolver dbConnection;
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
String src = eventContext.getMessageAsString();
DbConfig config = dbConnection.resolve(null);
try {
DbConnection conn = config.getConnectionFactory().createConnection(TransactionalAction.JOIN_IF_POSSIBLE);
Clob clob = conn.createClob();
clob.setString(1, src);
try (PreparedStatement stmt = conn.prepareStatement("INSERT INTO tblClobTest (cdata) values(?)")) {
stmt.setClob(1, clob);
stmt.executeUpdate();
}
return 1;
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
public void setDbConnection(StaticDbConfigResolver o){
this.dbConnection = o;
}
答案 1 :(得分:0)
使用CLOB插入SQL
可以通过以下配置将CLOB插入数据库表中:
<db:insert config-ref="databaseConfiguration" doc:name="Database">
<db:parameterized-query>
<![CDATA[INSERT INTO T_IMPORT_FILE (CONTENT) VALUES (:content)]]>
</db:parameterized-query>
<db:in-param name="content" type="CLOB" value="#[payload]" />
</db:insert>