How can I get the SQL of a PreparedStatement?
java, jdbc, prepared-statement, sql
Solution
Using prepared statements, there is no "SQL query" :
- You have a statement, containing placeholders
- it is sent to the DB server
- and prepared there
- which means the SQL statement is "analysed", parsed, some data-structure representing it is prepared in memory
- And, then, you have bound variables
- which are sent to the server
- and the prepared statement is executed -- working on those data
But there is no re-construction of an actual real SQL query -- neither on the Java side, nor on the database side.
So, there is no way to get the prepared statement's SQL -- as there is no such SQL.
For debugging purpose, the solutions are either to :
- Ouput the code of the statement, with the placeholders and the list of data
- Or to "build" some SQL query "by hand".
Problem
I have a general Java method with the following method signature: ``` private static ResultSet runSQLResultSet(String sql, Object... queryParams) ``` It opens a connection, builds a `PreparedStatement` using the sql statement and the parameters in the `queryParams` variable length array, runs it, caches the `ResultSet` (in a `CachedRowSetImpl`), closes the connection, and returns the cached result set. I have exception handling in the method that logs errors. I log the sql statement as part of the log since it's very helpful for debugging. My problem is that logging the String variable `sql` logs the template statement with ?'s instead of actual values. I want to log the actual statement that was executed (or tried to execute). So... Is there any way to get the actual SQL statement that will be run by a `PreparedStatement`? (Without building it myself. If I can't find a way to access the `PreparedStatement's` SQL, I'll probably end up building it myself in my `catch`es.)