我有一些访问 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...