使用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过程。
任何能给我指出正确方向的线索都将不胜感激。
提前谢谢。
发布于 2014-09-23 05:54:45
我认为问题在于您没有在存储过程中定义参数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>https://stackoverflow.com/questions/25950576
复制相似问题