什么可能导致SQL Server JDBC错误'输出参数访问的参数号0'没有设置值?

Mat*_*och 8 sql-server stored-procedures jdbc mssql-jdbc

我有一些访问SQL Server 2005的Java代码,如下所示:

CallableStatement cstmt = ...;
... // Set input parameters
cstmt.registerOutParameter(11, Types.INTEGER);
cstmt.execute();
int out = cstmt.getInt(11);
Run Code Online (Sandbox Code Playgroud)

从最后一行抛出以下异常:

com.microsoft.sqlserver.jdbc.SQLServerException: The value is not set 
     for the parameter number 0.
   at com.microsoft.sqlserver.jdbc.SQLServerException.
     makeFromDriverError(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
     skipOutParameters(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
     getOutParameter(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
     getterGetParam(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
     getInt(Unknown Source)
   at org.jboss.resource.adapter.jdbc.WrappedCallableStatement.
     getInt(WrappedCallableStatement.java:192)
Run Code Online (Sandbox Code Playgroud)

被调用的存储过程看起来像这样:

CREATE PROCEDURE dbo.stored_proc ( -- 10 input parameters
                                 , @out_param INT OUTPUT) AS

-- Variable declarations 

SET @out_param = 0

-- Do processing...

SET @out_param = 1
Run Code Online (Sandbox Code Playgroud)

由于输入参数在进入存储过程时设置为零,在什么情况下可以不设置该值?还是我误解了错误信息?

此错误可通过以下方式重现:

  • SQL Server JDBC驱动程序1.2
  • SQL Server 2005(64位)Service Pack 2
  • SQL Server 2005(64位)Service Pack 3

更新:由于-- Do processing...存储过程的一部分,它似乎正在发生.删除它可以消除错误.这里有太多的代码要重现,我想要的是一些可能导致缩小可能候选人的原因.

更新:将错误(例如除以零)注入-- Do processing...存储过程的一部分不会导致抛出此异常(相反,正如预期的那样,execute()调用失败并显示相应的错误消息).

更新:反编译com.microsoft.sqlserver.jdbc.SQLServerCallableStatement类建议'参数号0'是存储过程返回值.

更新:我无法通过Management Studio直接调用存储过程来重现此问题.

更新:此错误的最终原因似乎是存储过程中死锁.但是,通常死锁会导致execute()调用因SQLException包装SQL Server错误代码1205 而失败...

DFo*_*k42 0

关于您的参数,您只是声明它们还是将它们设置为默认值?尝试将它们设置为默认值 null 或其他值,看看是否仍然收到错误。

如果您有一个参数未设置为默认值并且在执行存储过程时没有向其传递值,则 sql server 不喜欢它。