Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как просмотреть SQL код в PreparedStatement?


Автор: NosfBlazE 9.9.2011, 08:13
Здравствуйте.
На java начал писать недавно, поэтому задам детский вопрос, ответ на который в инете найти так и не смог. smile
Вот кусок кода
Код

...
String sql = "SELECT ID_PERIODICAL FROM PERIODICAL WHERE CODE = ?";
PreparedStatement psGetIdPer = connection.prepareStatement(sql);
...                
psGetIdPer.setString(1, issue.getIssue().get(i).getCode());
Logger.logInfo( "SQL: %s", sql);
...


Здесь Logger - класс для ведения логов, просто вывод в данном примере.
[INFO] SQL: SELECT ID_PERIODICAL FROM PERIODICAL WHERE CODE = ?

Так вот, как достать из psGetIdPer sql команду, полученную после подстановки вместо '?' конкретного значения? То есть, чтобы в логах писалось не CODE = ?, как сейчас, а CODE = 'код'.

Автор: aleksandy 9.9.2011, 09:25
В общем случае никак: все зависит от конкретного драйвера. Можно попытаться вытянуть через рефлексию, но не факт, что драйвер заменяет "?" на значения. Думаю, он может отправлять шаблон запроса и параметры отдельно.

Автор: NosfBlazE 9.9.2011, 09:58
Ах да, совсем забыл, извините. Драйвер
Код

Connection connection = DriverManager.getConnection("jdbc:sapdb://localhost/ ... ", "login", "pass");

Очень странно, что нет соответствующего метода среди стандартных. оО Поскольку данные берутся из списка, то желательно отображать в логе формирующийся при этом sql.
Спасибо за быстрый ответ, но не хотелось бы прибегать к накручиванию сложных вещей в коде ради этого. Если нет какого-то простого способа, то придется обойтись без лога. (

Автор: LSD 9.9.2011, 10:14
Цитата(NosfBlazE @  9.9.2011,  09:13 Найти цитируемый пост)
Так вот, как достать из psGetIdPer sql команду, полученную после подстановки вместо '?' конкретного значения?

Дело в том, что большинство нормальных СУБД не подставляют конкретное значение в запрос. Это сделано специально, чтобы экономить время на разбор запроса.

Автор: Farmazon 9.9.2011, 12:41
включи подробные логи в бд 0_О

Добавлено через 41 секунду
может твоя бд умеет говорить, какими запросами её кормят...

Автор: NosfBlazE 9.9.2011, 17:36
Farmazon, в бд само собой логи ведутся. Но бд одна на всех, а приложение - всего лишь небольшая часть всей системы. Поэтому при отладке желательно видеть эти логи отдельно.

Спасибо всем за ответы, хотя бы разобрался в общей сути возникшей проблемы. smile

Автор: Ares4322 10.9.2011, 16:24
А prepStmt.toString() не катит?

Автор: LSD 10.9.2011, 17:48
Цитата(Ares4322 @  10.9.2011,  17:24 Найти цитируемый пост)
А prepStmt.toString() не катит? 

JDBC стандарт не декларирует этот метод, и потому как его реализовывать (и реализовывать ли вообще) зависят от СУБД. В том же Оракле он не реализован.

Автор: Старовъръ 12.9.2011, 16:55
Цитата
Так вот, как достать из psGetIdPer sql команду, полученную после подстановки вместо '?' конкретного значения? То есть, чтобы в логах писалось не CODE = ?, как сейчас, а CODE = 'код'. 
JDBC драйвер не подставляет это значение в строку, соответственно никак (разве что PreparedStatement драйвером не поддерживается smile). Возможно СУБД может предоставить такой лог, но опять же - вряд ли запрос будет именно в таком виде. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)