camel-mybatis - 使用多个结果集调用Oracle存储过程的问题

时间:2014-05-09 16:58:49

标签: oracle stored-procedures apache-camel mybatis

我在Fuse 6.1环境中使用camel-mybatis(版本2.12)组件来调用带有2个结果集的oracle SP。请求是一个HashMap,一旦mybatis将结果集映射到java bean,List就会再次保存在原始的HashMap中。

以下是SqlMap的片段:

<select
    id="searchUsers"
    parameterType="java.util.HashMap"       
    statementType="CALLABLE">
    {call ORACLE.SP_NAME_1(
        #{userId,mode=IN,jdbcType=VARCHAR},
  #{maxResultsCount,mode=IN,jdbcType=DECIMAL},
  #{view,mode=IN,jdbcType=VARCHAR},
  #{statusInfo,mode=OUT,jdbcType=CURSOR,resultMap=statusInfoRowMap},
  #{memberInfo,mode=OUT,jdbcType=CURSOR,resultMap=claimInfoRowMap})}

以下是我调用mybatis组件的方法:

<setBody>
    <groovy>
[
    userId:'ID-1234',
    maxResultsCount:20,
    view:'MEMBER',
]
   </groovy>
</setBody>
<to uri="mybatis:searchUsers?statementType=SelectOne" />

由于没有结果对象(所有结果都存储在原始请求的HashMap本身中),MyBatisProducer设置为null以交换OUT消息。包含存储过程结果的原始主体将丢失。

问题是:这是预期的行为吗? mybatis组件已经将结果存储在交换头中,那么为什么还要更新主体呢?

我必须做的解决方法是 - 将原始主体存储到标头,调用mybatis并从标头重置主体(现在具有存储过程结果):

<setBody>
            <groovy>
                [
             userId:'ID1234',
             maxResultsCount:20,
             view:'MEMBER'
          ]
        </groovy>
    </setBody>
    <setHeader headerName="originalRequest">
        <simple>${body}</simple>
    </setHeader>
    <to uri="mybatis:searchUsers?statementType=SelectOne" />
    <setBody>
        <simple>${in.headers.originalRequest}</simple>
    </setBody>
    <log message="status: ${body[statusInfo]}" />

任何帮助将不胜感激..谢谢。

1 个答案:

答案 0 :(得分:0)

很好地发现了。记录JIRA票证,以便我们可以改进这一点并避免在使用存储过程时将主体设置为null。

此处有一个指向问题跟踪器的链接