首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mule 3.5.0 ESB中从存储过程调用中获取返回值

在Mule 3.5.0 ESB中从存储过程调用中获取返回值
EN

Stack Overflow用户
提问于 2014-09-20 23:54:28
回答 1查看 2.6K关注 0票数 3

使用Mule CE 3.5.0和SQL Server 2005。

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

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

以下是示例存储过程代码,

代码语言:javascript
复制
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输出参数。

代码语言:javascript
复制
<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元素以尝试获取返回值。

代码语言:javascript
复制
<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抛出以下错误,

代码语言:javascript
复制
********************************************************************************
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过程。

任何能给我指出正确方向的线索都将不胜感激。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-09-23 05:54:45

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

你应该有这样的东西:

代码语言:javascript
复制
CREATE PROCEDURE dbo.sp_AddConnection (@pUserName varchar(30),   
                                       @pPassword varchar(30),   
                                       @opConnectionID bigint OUTPUT,
                                       @returnValue int OUTPUT) 

以及去参数化的查询:

代码语言:javascript
复制
<db:parameterized-query><![CDATA[{ CALL :returnValue = dbo.sp_Add_Connection(:pUserName, :pPassword, :opConnectionID, :returnValue) }]]></db:parameterized-query>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25950576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档