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...ストアド プロシージャの一部の結果として発生しているようです。これを削除すると、エラーが解消されます。ここで再現するにはコードが多すぎます。可能性の高い候補を絞り込むための考えられる原因へのポインタが必要です。

更新:エラー (0 による除算など) を-- Do processing...ストアド プロシージャの一部に挿入しても、この例外はスローされませんexecute()(代わりに、予想どおり、呼び出しは適切なエラー メッセージで失敗します)。

更新: com.microsoft.sqlserver.jdbc.SQLServerCallableStatement クラスを逆コンパイルすると、「パラメーター番号 0」がストアド プロシージャの戻り値であることが示唆されます。

更新: Management Studio から直接ストアド プロシージャを呼び出しても、これを再現できませんでした。

更新:このエラーの最終的な原因は、ストアド プロシージャのデッドロックのようです。ただし、通常、デッドロックによりexecute()呼び出しが失敗し、SQLExceptionSQL Server エラー コード 1205... がラップされます。

4

5 に答える 5

0

頭に浮かぶことがいくつかあります。

  1. RETURN xがありません(xは処理の結果を表すINT、0 =成功、その他は警告またはエラーを表します)。
  2. クライアントコードは、出力パラメータに加えて戻り値のパラメータを割り当てません。

お役に立てれば、

明細書

于 2009-05-23T06:53:32.697 に答える
0

パラメータについて、宣言するだけですか、それともデフォルト値に設定しますか?それらをデフォルト値のnullか何かに設定してみて、それでもエラーが発生するかどうかを確認してください。

デフォルト値に設定されていないパラメータがあり、ストアドプロシージャを実行するときに値を渡さない場合、SQLServerはそれを好みません。

于 2009-05-13T15:37:26.730 に答える
0

出力パラメータを登録していますか? ドキュメントによると、「ストアドプロシージャを実行する前に、すべての OUT パラメータを登録する必要があります。」

于 2009-05-13T15:41:20.267 に答える
0

SQL Server 2008でまだこの問題が発生している場合。

DateTime フィールドに Timestamp を設定しようとすると、更新ステートメントで同じ問題が発生しました。問題のあるフィールドは、報告されたインデックスとは異なるインデックスの where 句にありました。

于 2016-04-25T13:06:13.540 に答える