使用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 vs Mule EE的事情,但我在参考文档中没有看到任何内容,说这个功能仅在Mule EE中可用。
也许我只是错误地调用db:stored-procedure。
任何指出我正确方向的线索都将受到赞赏 提前致谢。
答案 0 :(得分: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>