公式の Sybase JDBC ドライバーを使用してデータベースに接続し、CallableStatement を作成してストアド プロシージャを呼び出し、パラメーターをそれにバインドし、.execute() を呼び出しています。
ただし、ストアド プロシージャが失敗しても、例外はスローされないことがわかりました。Wireshark を使用してデータベースへのトラフィックをスニッフィングし、戻ってくるエラー メッセージを観察することで、障害が伝播されていることを確認できます。
最後に、.execute() の代わりに .executeUpdate() を使用すると例外が発生することがわかりましたが、まだ 2 つの質問が残っています。
- .execute() と .executeUpdate() の動作が異なるのはなぜですか? インターフェイスの SUN ドキュメントから、(ほぼ) 同じことを行う必要があるようです...
- ストアド プロシージャを呼び出すときに .execute() を .executeUpdate() に置き換えることは常に適切ですか? ストアド プロシージャは、.executeUpdate() で呼び出すことができる特定の要件に準拠する必要がありますか? (たとえば、最後のステップとして update/delete/insert ステートメントが必要ですか?)
更新: jTDS を試してみましたが、正しく動作します (.execute() と .executeUpdate() の両方の場合で SQLException をスローします)。ただし、私には制御できない制約があるため、ドライバーを切り替えることは実際には不可能です。
また、このストアド プロシージャによって返される結果には興味がありません。挿入/更新タイプのプロシージャです。失敗したかどうかを確認するためだけに挿入されます(そして、キャッチ/ログを記録できます)。私が試したもう1つのことは、.execute()の後に接続から警告を取得することですが、何も含まれていませんでした。