Как получить значения параметров связывания из объекта Oracle JDBC PreparedStatement - PullRequest
9 голосов
/ 15 июля 2009

Я хочу реализовать ведение журнала всех выполненных операторов с фактическими параметрами связывания при использовании Oracle JDBC. И я бы предпочел, чтобы я мог создать такой метод ведения журнала, только передав в качестве параметра объект PreparedStatement.

Например, я создал PreparedStatement и связал один параметр

PreparedStatement ps = conn.prepareStatement(
    "SELECT * FROM employees WHERE employee_id = ?");
ps.setInt(1,1);

Теперь я хотел бы получить от ps фактический оператор SQL "SELECT * FROM сотрудников WHERE employee_id = 1", который я мог бы поместить в файл журнала.

Пока я обнаружил, что могу использовать

((oracle.jdbc.driver.OracleStatement) ps).getOriginalSql()

чтобы получить

SELECT * FROM employees WHERE employe_id = ?

Теперь мне нужен какой-то способ получить список текущих переменных связывания из ps, чтобы я мог заменить? со значениями параметров связывания.

Я пытался посмотреть в ps.getClass (). GetDeclaredFields () и ps.getClass (). GetSuperclass (). GetDeclaredFields (), но до сих пор не смог найти место, где хранятся значения параметров связывания и их типы.

Есть предложения, где их искать?

Ответы [ 2 ]

2 голосов
/ 15 июля 2009

Большинство каркасов ведения журналов имеют понятие Вложенный диагностический контекст . Вы можете сохранить свой запрос и его параметры там, когда будете заполнять подготовленный оператор.

Или, возможно, сделать это за один шаг:

PreparedStatement fillAndLog(Connection conn, String query, Object... args) {
    int i = 0;
    PreparedStatement pstmt = conn.prepareStatement(query);
    for (Object o : args) {
       if (o instanceof String) {
           pstmt.setString(i, (String)o);
       } // else...
       i++;
    }
    log.debug(String.format(query.replaceAll("\\?", "%s"), args));
    return pstmt;
}
1 голос
/ 15 июля 2009

Вы можете взглянуть на p6spy , это прокси для вашего драйвера базы данных, который позволяет отслеживать и регистрировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...