无法使用Mule从数据库中检索值

时间:2016-03-30 07:59:14

标签: database stored-procedures mule query-parameters

我试图通过浏览器传递多个查询参数

http://localhost:8081/test?SourceQueue=mqinput&PayloadMsgId=11004a90Test0001-3

我的流程如下, 我使用set payload transformer将查询参数设置为有效负载,然后将这些值传递给存储过程。但我无法从数据库中检索值。数据库连接器后有效内容为null。

流程的 config xml 如下:

    <set-payload value="SourceQueue=#[message.inboundProperties.'http.query.params'.SourceQueue],PayloadMsgId=#[message.inboundProperties.'http.query.params'.PayloadMsgId]" doc:name="Set Payload"/>
    <logger message="#[payload]----------------before db" level="INFO" doc:name="Logger"/>
   <db:stored-procedure config-ref="Generic_Database_Configuration" doc:name="Database">
        <db:parameterized-query><![CDATA[{CALL E_Enquiry(:SourceQueue1,:PayloadMsgId1)}]]></db:parameterized-query>
        <db:in-param name="PayloadMsgId1" type="VARCHAR" value="#[payload.SourceQueue]"/>
        <db:in-param name="SourceQueue1" type="VARCHAR" value="#[payload.PayloadMsgId]"/>

    </db:stored-procedure>
    <logger message="#[payload]----output" level="INFO" doc:name="Logger"/>

我的存储过程如下:

CREATE OR REPLACE PROCEDURE E_Enquiry 
    (IN SourceQueue1 VARCHAR(30) DEFAULT NULL,
     IN PayloadMsgId1 VARCHAR(100) DEFAULT NULL) 
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN 
    DECLARE C1 CURSOR WITH RETURN TO CLIENT FOR 
        select PayloadMsgId,ExceptionId,EventSource,E_Message.InterfaceId,
            CreationTime,SourceProtocol,ErrorMessage,Severity,InterfaceName 
        from E_Message,E_Config
        where (SourceQueue=SourceQueue1 and PayloadMsgId=PayloadMsgId1); 
    open c1; 
END;

请帮忙解决此问题。

2 个答案:

答案 0 :(得分:0)

你的表达: -

<set-payload value="SourceQueue=#[message.inboundProperties.'http.query.params'.SourceQueue],PayloadMsgId=#[message.inboundProperties.'http.query.params'.PayloadMsgId]" doc:name="Set Payload"/>

不正确,您无法通过将其设置为有效负载来实现此目的,因为有效负载是现在的String格式而不是Object。

理想的解决方案是使用变量,如下所示: -

<set-variable variableName="SourceQueuevar" value="#[message.inboundProperties.'http.query.params'.SourceQueue]" doc:name="Set SourceQueuevar"/>

 <set-variable variableName="PayloadMsgIdvar" value="#[message.inboundProperties.'http.query.params'.PayloadMsgId]" doc:name="Set PayloadMsgIdvar"/>

设置完成后,您可以轻松地在以下表达式中的 SQL logger 中的任何位置使用它,例如: - #[flowVars.SourceQueuevar] #[flowVars.PayloadMsgIdvar]

答案 1 :(得分:0)

FlowVars是一个选项,但您也可以使用以下表示法轻松创建地图:

<set-payload value="#[['SourceQueue':message.inboundProperties.'http.query.params'.SourceQueue,'PayloadMsgId':message.inboundProperties.'http.query.params'.PayloadMsgId]]" doc:name="Set Payload"/>

通过这种方式,您可以将有效负载作为对象访问(因为它是一个映射)。您可以使用如下表达式访问有效负载值:

#[payload.SourceQueue] 

#[payload.PayloadMsgId]