【问题标题】:Get Return value from stored procedure call in Mule 3.5.0 ESB从 Mule 3.5.0 ESB 中的存储过程调用获取返回值
【发布时间】:2014-11-15 00:45:45
【问题描述】:

使用 Mule CE 3.5.0 和 SQL Server 2005。

我正在尝试使用新的 Mule 连接器 db:generic-config & db:stored-procedure 调用存储过程,然后从存储过程中检索返回值。

由于某种原因,我无法让 Mule 从存储过程中检索返回值。

这里是示例存储过程代码,

CREATE PROCEDURE dbo.sp_AddConnection (@pUserName varchar(30),   
                                       @pPassword varchar(30),   
                                       @opConnectionID bigint OUTPUT)  
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @rc int;

  SET @opConnectionID = 0;

  ....
  --If login is good then 
  --SET @rc = 0
  --SET @opConnectionID = new ConnectionID from Connection table

  --If login is bad then 
  --SET @rc = 1
  --SET @opConnectionID = 0

  ....

  SET NOCOUNT OFF;
  RETURN(@rc);
END;

以下 Mule 代码用于检索 ConnectionID 输出参数。

<db:generic-config  name="MSSQL" 
                    url="jdbc:sqlserver://local:1433;user=username;password=password;applicationName=Mule-ESB;databaseName=db1;" 
                    driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
                    doc:name="Generic Database Configuration"/>

<flow name="jdbctestFlow1" doc:name="jdbctestFlow1">
    <quartz:inbound-endpoint    jobName="CronJobSchedule" 
                                doc:name="Quartz"
                                repeatInterval="0" 
                                responseTimeout="10000" 
                        cronExpression="00 29 01 ? * *"> <!-- Change as necessary --->                  
        <quartz:event-generator-job/>              
    </quartz:inbound-endpoint>
    <db:stored-procedure config-ref="MSSQL" doc:name="Database">
        <db:parameterized-query><![CDATA[{ CALL dbo.sp_Add_Connection(:pUserName, :pPassword, :opConnectionID) }]]></db:parameterized-query>
        <db:in-param name="pEmail" type="VARCHAR" value="user1"/>
        <db:in-param name="pPassword" type="VARCHAR" value="1234"/>
        <db:inout-param name="opConnectionID" type="BIGINT" value="0"/>                        
    </db:stored-procedure>
    <logger message="opConnectionID = #[message.payload['opConnectionID']]" level="INFO" doc:name="Logger"/>
</flow>  

上述 Mule 流程有效,我可以 我可以使用#[message.payload['opConnectionID']] 获取 ConnectionID 输出变量。

接下来我更改了 db:stored-procedure 元素以尝试获取返回值。

<flow name="jdbctestFlow1" doc:name="jdbctestFlow1">
    <quartz:inbound-endpoint    jobName="CronJobSchedule" 
                                doc:name="Quartz"
                                repeatInterval="0" 
                                responseTimeout="10000" 
                        cronExpression="00 29 01 ? * *"> <!-- Change as necessary --->                  
        <quartz:event-generator-job/>              
    </quartz:inbound-endpoint>
    <db:stored-procedure config-ref="MSSQL" doc:name="Database">
        <db:parameterized-query><![CDATA[{ CALL :returnValue = dbo.sp_Add_Connection(:pUserName, :pPassword, :opConnectionID) }]]></db:parameterized-query>
        <db:out-param name="returnValue" type="INTEGER"/>
        <db:in-param name="pEmail" type="VARCHAR" value="user1"/>
        <db:in-param name="pPassword" type="VARCHAR" value="1234"/>
        <db:inout-param name="opConnectionID" type="BIGINT" value="0"/>                        
    </db:stored-procedure>
    <logger message="Finish SP call" level="INFO" doc:name="Logger"/> <!-- doens't make it here -->
    <logger message="opConnectionID = #[message.payload['opConnectionID']]" level="INFO" doc:name="Logger"/>
    <logger message="returnValue = #[message.payload['returnValue']]" level="INFO" doc:name="Logger"/>
</flow> 

Mule 抛出以下错误,

********************************************************************************
Message               : Index: 5, Size: 5 (java.lang.IndexOutOfBoundsException). Message payload is of type: NullPayload
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Index: 5, Size: 5 (java.lang.IndexOutOfBoundsException)
  java.util.LinkedList:-1 (null)
2. Index: 5, Size: 5 (java.lang.IndexOutOfBoundsException). Message payload is of type: NullPayload (org.mule.api.MessagingException)
  org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor:32 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
    at java.util.LinkedList.checkElementIndex(Unknown Source)
    at java.util.LinkedList.get(Unknown Source)
    at org.mule.module.db.internal.domain.executor.AbstractExecutor.doProcessParameters(AbstractExecutor.java:51)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************  

我认为这可能是 Mule CE 与 Mule EE 的对比,但我在参考文档中没有看到任何内容说此功能仅在 Mule EE 中可用。

也可能是我只是错误地调用了 db:stored-procedure。

任何能指引我正确方向的线索将不胜感激。
提前致谢。

【问题讨论】:

    标签: sql-server-2005 stored-procedures mule


    【解决方案1】:

    我认为问题在于您没有在存储过程中定义参数 returnValue。

    你应该有这样的东西:

    CREATE PROCEDURE dbo.sp_AddConnection (@pUserName varchar(30),   
                                           @pPassword varchar(30),   
                                           @opConnectionID bigint OUTPUT,
                                           @returnValue int OUTPUT) 
    

    还有去参数化查询:

    <db:parameterized-query><![CDATA[{ CALL :returnValue = dbo.sp_Add_Connection(:pUserName, :pPassword, :opConnectionID, :returnValue) }]]></db:parameterized-query>
    

    【讨论】:

    • MS Sql Server 的存储过程可以返回不在参数列表中的状态代码。阅读各种网站和 Mulesoft 的 Github(?) 看起来这是一个将在未来版本中修复的问题。
    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多