programing

Oracle JDBC PreparedStatement 개체에서 바인딩 매개 변수 값을 가져오는 방법

megabox 2023. 10. 11. 20:35
반응형

Oracle JDBC PreparedStatement 개체에서 바인딩 매개 변수 값을 가져오는 방법

Oracle JDBC를 사용할 때 실행된 모든 문장의 로깅을 실제 바인딩 파라미터로 구현하고자 합니다.그리고 이러한 로깅 방법은 PreparedStatement 개체를 매개 변수로 전달하는 것만 가능했으면 합니다.

예를 들어 PreparedStatement를 작성하고 파라미터를 하나 바인딩했습니다.

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

이제 ps에서 로그 파일에 넣을 수 있는 실제 SQL 문 "SELECT * FROM memployee_id = 1"을 얻을 수 있으면 좋겠습니다.

지금까지 제가 사용할 수 있는

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

갖기 위해

SELECT * FROM employees WHERE employe_id = ?

이제 ps에서 현재 바인딩 변수 목록을 가져와 bind 매개 변수 값으로 대체할 수 있는 방법이 필요합니다.

ps.getClass().getDeclaredFields()와 ps.getClass().getSuperclass().getDeclaredFields()를 검색해 보았지만 bind 매개 변수 값과 해당 유형이 저장된 위치를 아직 찾지 못했습니다.

그들을 어디서 찾을지 제안해 주실 수 있나요?

대부분의 로깅 프레임워크는 Nested Diagnostic Context에 대한 개념을 가지고 있습니다.준비된 문을 채울 때 쿼리와 해당 매개 변수를 저장할 수 있습니다.

아니면 한 걸음에 할 수도 있습니다.

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;
}

p6spy는 데이터베이스 드라이버에 대한 프록시로 모니터링 및 로깅이 가능합니다.

언급URL : https://stackoverflow.com/questions/1130886/how-to-get-values-of-bind-parameters-from-oracle-jdbc-preparedstatement-object

반응형