8

我有一些访问 SQL Server 2005 的 Java 代码,看起来像这样:

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

最后一行抛出以下异常:

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)

被调用的存储过程如下所示:

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

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

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

  • SQL Server JDBC 驱动程序 1.2
  • SQL Server 2005(64 位)服务包 2
  • SQL Server 2005(64 位)服务包 3

更新:它似乎是由于-- Do processing...存储过程的一部分而发生的。删除它可以消除错误。这里要重现的代码太多,我想要的是一些指向可能原因的指针,以缩小可能的候选范围。

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

更新:反编译 com.microsoft.sqlserver.jdbc.SQLServerCallableStatement 类表明 'parameter number 0' is the stored procedure return value

更新:我无法通过直接通过 Management Studio 调用存储过程来重现这一点。

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

4

5 回答 5

0

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

如果您的参数未设置为默认值并且您在执行存储过程时未将值传递给它,则 sql server 不喜欢它。

于 2009-05-13T15:37:26.730 回答
0

您是否正在注册输出参数?根据文档“必须在执行存储过程之前注册所有 OUT 参数。”

于 2009-05-13T15:41:20.267 回答
0

我想到了几件事:

  1. 您没有 RETURN x(其中 x 是表示处理结果的 INT,0 = 成功,其他任何内容都表示警告或错误)。
  2. 除了输出参数之外,您的客户端代码不会为返回值分配参数。

希望这可以帮助,

账单

于 2009-05-23T06:53:32.697 回答
0

反编译 com.microsoft.sqlserver.jdbc.SQLServerCallableStatement 类表明“参数号 0”是存储过程的返回值。

那是正确的。如果您的存储过程定义有 11 个输入/输出参数,您实际上需要在调用代码中定义 12 个。参数 0 是返回码。

例如,对于具有一个输入和一个输出参数的 SP,在 SSMS 中运行以下命令:

DECLARE @ReturnValue INT
DECLARE @P1 INT, @P2 INT

EXEC @ReturnValue= YourSP(@P1,@P2 OUTPUT)

您实际上需要在这里处理三个参数,而不是两个。

于 2014-09-22T00:22:08.907 回答
0

万一有人在 SQL Server 2008 上仍然遇到这个问题。

在尝试为 DateTime 字段设置时间戳时,我在更新语句中遇到了同样的问题。违规字段位于与报告的索引不同的索引处的 where 子句中。

于 2016-04-25T13:06:13.540 回答