次のような 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...
ストアド プロシージャの一部の結果として発生しているようです。これを削除すると、エラーが解消されます。ここで再現するにはコードが多すぎます。可能性の高い候補を絞り込むための考えられる原因へのポインタが必要です。
更新:エラー (0 による除算など) を-- Do processing...
ストアド プロシージャの一部に挿入しても、この例外はスローされませんexecute()
(代わりに、予想どおり、呼び出しは適切なエラー メッセージで失敗します)。
更新: com.microsoft.sqlserver.jdbc.SQLServerCallableStatement クラスを逆コンパイルすると、「パラメーター番号 0」がストアド プロシージャの戻り値であることが示唆されます。
更新: Management Studio から直接ストアド プロシージャを呼び出しても、これを再現できませんでした。
更新:このエラーの最終的な原因は、ストアド プロシージャのデッドロックのようです。ただし、通常、デッドロックによりexecute()
呼び出しが失敗し、SQLException
SQL Server エラー コード 1205... がラップされます。