2014-09-20 23 views
2

返回值使用騾子CE 3.5.0 & SQL Server 2005的從存儲過程調用獲取騾子3.5.0 ESB

我試圖使用新的騾子連接器分貝調用存儲過程:仿製配置& db:存儲過程,然後從存儲過程中檢索返回值。

由於某些原因,我無法讓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; 

以下騾代碼工作以檢索的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> 

以上騾子流作品,我可以 我可以#[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> 

騾子引發以下錯誤,

******************************************************************************** 
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) 
******************************************************************************** 

我想它可能是一個騾子CE VS騾子EE的事情,但我沒有看到任何的參考文檔說這個功能僅可在Mule EE中找到。

也可能是我只是不正確地調用db:stored-procedure。

任何線索指向我在正確的方向將不勝感激。
在此先感謝。

回答

0

我認爲問題是你沒有在你的存儲過程中定義的參數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> 
+1

從MS SQL Server存儲過程可以返回一個狀態代碼,是不是在參數列表中。通過閱讀各種網站和Mulesoft的Github(?),看起來這是一個將在未來版本中修復的問題。 – KPB 2014-09-23 21:44:07