programing

Java에서 Statement(Callable Statement)를 인쇄하는 방법은 무엇입니까?

telecom 2023. 6. 24. 08:46
반응형

Java에서 Statement(Callable Statement)를 인쇄하는 방법은 무엇입니까?

이 Oracle Callable Statement를 인쇄하려면 어떻게 해야 합니까?

   ocstmt = (OracleCallableStatement) connection.prepareCall("{?= call 
            package.method(id => ?, name=>?)}");
   ocstmt.registerOutParameter(1, OracleTypes.CURSOR);            
   ocstmt.setInt(2, obj.getId());
   ocstmt.setString(3, obj.getName());
   ocstmt.execute();
   resultSet = ocstmt.getCursor(1);

제 말은 어떤 쿼리가 데이터베이스로 전송되는지 어떻게 알 수 있는지, 어떻게 쿼리를 인쇄할 수 있는지를 알 수 있다는 것입니다. 때때로 "잘못된 유형"과 같은 오류가 발생하기 때문에 이 쿼리를 살펴보아야 합니다.

당신은 log4j를 사용하고 있습니까?

그렇다면 아래와 같이 sql에 대한 로거를 추가합니다.

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

ibatis와 같은 ORM 프레임워크를 사용하는 경우 아래와 같이 로거를 추가할 수 있습니다.

log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG

네, 할 수 있습니다.호출 가능한 문을 인쇄할 때 실제 값을 대체할 수 있는 프록시로 포장하거나(및 sql 표시) String.javaworld 기사 p6spy 등이 있는 드라이버를 검색할 수 있습니다.저장 프로시저는 더 어렵지만 여전히 실행 가능합니다.

명세서를 인쇄해서는 SQL을 얻을 수 없습니다.

당신이 올린 예가 오류를 유발하는 "가끔" 중 하나입니까?

Oracle Callable Statement에 이 문제를 적용해야 하는 이유는 무엇입니까?통화의 어떤 부분이 표준 통화 가능 명세서가 아닌가요?

일반적으로 myObject.toString()을 사용하여 인쇄 내용을 확인합니다.전체 쿼리를 볼 수도 있고 볼 수도 없습니다.이동할 수 없는 경우 먼저 API 설명서(사용 중인 Oracle 라이브러리 또는 드라이버의 javadocs)를 참조하십시오.

제가 질문을 이해했는지는 모르겠지만, 여러분은 이것을 보고 싶어하는 것 같습니다.

  String sql = "{?= call package.method(id => ?, name=>?)}";
  System.out.println(sql);
  ocstmt = (OracleCallableStatement) connection.prepareCall(sql);
  ...

프록시 jdbc 드라이버를 사용하여 모든 jdbc 데이터베이스 작업을 기록할 수 있습니다.이 드라이버는 값과 결과가 포함된 모든 문을 인쇄할 수 있습니다.

제 솔루션은 ProxyDataSourceBuilder를 사용하는 것입니다(SpringBoot 프로젝트에서 사용).

@Bean
public DataSource dataSource() {
    SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
    return ProxyDataSourceBuilder
            .create(datasource)
            .listener(loggingListener)
            .build();
}

...

@Autowired
private DataSource dataSource;

Connection connection = dataSource.getConnection();
ocstmt = (OracleCallableStatement) connection.prepareCall("{?= call 
        package.method(id => ?, name=>?)}");

그리고 그냥 application.yml:

logging: 
    level:
      net.ttddyy.dsproxy.listener.logging: debug

해라

 > java -classpath ojdbc8.jar oracle.jdbc.driver.OracleSql false false "<your sql here>"

그러면 드라이버가 데이터베이스로 보내는 SQL이 인쇄됩니다.이것은 문서화되거나 지원되지 않지만, 영원히 존재해 왔습니다.

실행된 쿼리에 값이 있는지 확인하는 경우 유용할 수 있다고 생각했습니다.

System.out.println("value : "+CallableStatement.execute());

즉, "CallableStatement.execute()"에서 반환되는 "false"는 JDBC 문이 행을 읽지 않았음을 의미합니다(따라서 읽을 ResultSet이 없습니다).이는 저장 프로시저가 결과 집합을 직접 반환하지 않기 때문에 OUT 또는 INOUT 매개 변수에 대한 값만 반환합니다.

언급URL : https://stackoverflow.com/questions/4657349/how-to-print-statement-callablestatement-in-java

반응형