1

公式の Sybase JDBC ドライバーを使用してデータベースに接続し、CallableStatement を作成してストアド プロシージャを呼び出し、パラメーターをそれにバインドし、.execute() を呼び出しています。

ただし、ストアド プロシージャが失敗しても、例外はスローされないことがわかりました。Wireshark を使用してデータベースへのトラフィックをスニッフィングし、戻ってくるエラー メッセージを観察することで、障害が伝播されていることを確認できます。

最後に、.execute() の代わりに .executeUpdate() を使用すると例外が発生することがわかりましたがまだ 2 つの質問が残っています。

  1. .execute() と .executeUpdate() の動作が異なるのはなぜですか? インターフェイスの SUN ドキュメントから、(ほぼ) 同じことを行う必要があるようです...
  2. ストアド プロシージャを呼び出すときに .execute() を .executeUpdate() に置き換えることは常に適切ですか? ストアド プロシージャは、.executeUpdate() で呼び出すことができる特定の要件に準拠する必要がありますか? (たとえば、最後のステップとして update/delete/insert ステートメントが必要ですか?)

更新: jTDS を試してみましたが、正しく動作します (.execute() と .executeUpdate() の両方の場合で SQLException をスローします)。ただし、私には制御できない制約があるため、ドライバーを切り替えることは実際には不可能です。

また、このストアド プロシージャによって返される結果には興味がありません。挿入/更新タイプのプロシージャです。失敗したかどうかを確認するためだけに挿入されます(そして、キャッチ/ログを記録できます)。私が試したもう1つのことは、.execute()の後に接続から警告を取得することですが、何も含まれていませんでした。

4

3 に答える 3

5

それらの Sybase の人々は頭がおかしいので、それが例外を食べる理由です! 準備済み/呼び出し可能なステートメントに executeUpdate() の使用を避ける理由はありません。それが機能するために使用しなければならないものである場合は、先に進んでください。しかし、Sybase にバグ レポートを提出する必要があります。ドライバがそうすべき理由はありません。

于 2009-04-20T20:34:57.877 に答える
1

サイベースの人々が「クレイジー」かどうかはわかりません。多分。

一方、呼び出し可能なステートメントの戻りコードを積極的にチェックしない場合、結果を同期的に取得しないことは、パフォーマンスの点で理にかなっている場合があります。まだ完全にはテストしていませんが、問題に対する簡単な回避策があります (ASE 15.5、jconn 7):

ストアド プロシージャから out パラメータをフェッチすると、例外がトリガーされます (少なくともストアド プロシージャを呼び出すとき)。

    // one may force the error check by retrieving the return code!
    cs = conn.prepareCall("{ ? = call sp_nested_error @nNestLevels = 1 }");
    cs.registerOutParameter(1, Types.INTEGER);
    cs.execute();
    try {
        cs.getInt(1);
        fail();
    } catch(SQLException e) {
        assertTrue(e.getMessage().indexOf("some error") > -1);
    }

もう 1 つの興味深い点は、この動作はネストされたストアド プロシージャの呼び出しでエラーが発生した場合にのみ表示され、最上位のプロシージャでエラーが発生した場合は回避策が必要ないことです。

于 2012-08-06T11:46:38.933 に答える
0

Sybaseについては何も知りませんが、

executeUpdate は execute よりも多くの情報を返します: 挿入/更新/削除された行の数

→UPDATE INSERT DELETE、javadocによるDML操作で利用可能。

executeQuery は ResultSet を返します。これは SELECT ステートメント用です。

于 2009-04-16T07:17:26.817 に答える