我有一些访问 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
更新:它似乎是由于存储过程的 -- Doprocessing...
部分而发生的。删除此错误即可消除。这里有太多的代码需要重现,我想要的是一些可能的原因的指示,以缩小可能的候选范围。
更新:将错误(例如除以零)注入(inject)到存储过程的 -- Doprocessing...
部分不会导致抛出此异常(相反,如预期的那样,execute()
调用失败并显示相应的错误消息)。
更新:反编译 com.microsoft.sqlserver.jdbc.SQLServerCallableStatement 类表明“参数号 0”是存储过程返回值。
更新:我无法通过 Management Studio 直接调用存储过程来重现此问题。
更新:此错误的最终原因似乎是存储过程中的死锁。然而,死锁通常会导致 execute()
调用失败,并出现包含 SQL Server 错误代码 1205 的 SQLException
...
最佳答案
关于您的参数,您只是声明它们还是将它们设置为默认值?尝试将它们设置为默认值 null 或其他值,看看是否仍然收到错误。
如果您有一个参数未设置为默认值并且在执行存储过程时未向其传递值,则 SQL Server 不喜欢这种情况。
关于sql-server - 什么可能导致输出参数访问出现 SQL Server JDBC 错误 'The value is not set for the parameter number 0'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858631/