Mule将有效负载字符串转换为CLOB for Oracle DB Insert

时间:2017-03-01 15:48:46

标签: mule mule-studio

问题的基本要点是如何获取字符串有效负载并将其转换为CLOB以获取oracle <db:insert ... />

我需要在oracle数据库中写入和读取CLOB数据。将String转换为CLOB的典型方法是执行db.getConnection().createClob()之类的操作,然后将数据设置为此创建的CLOB。似乎在MULE中,这是一个合法的选项,因为我不会(或至少非平凡地)访问连接对象。 (也许我可以通过创建新连接并在变换器中进行转换来做一些hacky的东西?)

回顾一下文档和以前的版本,从V3.5.x开始,似乎有<jdbc:connector .../>的旧属性可以处理数据库中的各个行,并为这些行提供自定义处理程序。这个jdbc连接器已被弃用,我希望它将在以后的版本中删除。

那么这是如何工作的?骡子打算怎么做? 如何将字符串转换为CLOB以获取 <db:insert .../>

以下是重现问题的示例流程。

Simple Flow

<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使用上述流程解决了问题。

2 个答案:

答案 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>