1. ホーム
  2. java

[解決済み] PreparedStatementのSQLを取得するにはどうすればよいですか?

2022-04-30 07:39:19

質問

次のようなメソッドシグネチャを持つ一般的なJavaメソッドがあります。

private static ResultSet runSQLResultSet(String sql, Object... queryParams)

接続を開始し PreparedStatement のSQL文とパラメータを使用しています。 queryParams 可変長配列のキャッシュを作成し、それを実行します。 ResultSet (この場合 CachedRowSetImpl )、接続を閉じ、キャッシュされた結果セットを返します。

メソッドの中で例外処理を行い、エラーをログに記録しています。デバッグに非常に役立つので、ログの一部としてSQL文を記録しています。私の問題は、ロギングがString変数 sql は、実際の値ではなく、?が付いたテンプレートステートメントをログに記録します。私は 実際の ステートメントが実行された(または実行しようとした)。

で実行される実際のSQL文を取得する方法はないでしょうか? PreparedStatement ? ( なし 自分で作る もし、アクセスする方法が見つからなかったら PreparedStatement's のSQLを自分で構築することになりそうです。 catch をご覧ください)。

解決方法は?

プリペアドステートメントを使用すると、"SQLクエリ"が存在しない。

  • プレースホルダーを含むステートメントがあります。
    • DBサーバーに送信されます。
    • そこで準備される
    • つまり、SQL 文が分析され、解析され、それを表すデータ構造がメモリに準備されます。
  • そして、バインドされた変数があります。
    • サーバに送信される
    • そして、プリペアドステートメントが実行され、これらのデータで作業します。

しかし、実際のSQLクエリを再構築することは、Java側でもデータベース側でもありません。

つまり、プリペアドステートメントのSQLは存在しないので、取得する方法はありません。



デバッグのために、解決策としては、:

  • ステートメントのコードを、プレースホルダーとデータのリストとともに出力します。
  • または、手作業でSQLクエリを作成する。