Подтвердить что ты не робот

Как печатать Statement (CallableStatement) в Java?

Как я могу напечатать этот OracleCallableStatement?

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

Я имею в виду, как я могу узнать, что какой запрос идет в базу данных, как я могу распечатать запрос? потому что иногда это дает мне ошибку типа "Неверный тип", поэтому я хочу посмотреть на этот запрос

4b9b3361

Ответ 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

Если вы используете инфраструктуру ORM, такую ​​как ibatis, вы можете добавить дополнительный регистратор, как показано ниже.

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

Ответ 2

Да, вы можете это сделать. Вы можете либо обернуть свой вызываемый оператор в прокси-сервер, который может заменить фактические значения при его печати (и показать sql), либо остерегаться для драйвера, у которого есть значимая toString. статья javaworld Существует также p6spy и другие. Хранимые процедуры сложнее, но все же выполняются.

Ответ 3

Вы не можете получить SQL, распечатав Statement.

В качестве примера вы отправили одну из "иногда", которая вызывает ошибку?

Зачем вам это нужно для OracleCallableStatement? Какая часть вызова не является стандартным CallableStatement?

Ответ 4

В общем, используйте myObject.toString(), чтобы увидеть, что он печатает. Однако вы можете или не сможете просмотреть полный запрос. Если вы не можете заставить его уйти, первое, на что я буду смотреть, это документация по API (javadocs для этой библиотеки или драйвера Oracle, которые вы используете)

Ответ 5

Можно использовать прокси-драйвер jdbc для регистрации всех действий базы данных jdbc. этот драйвер может печатать все инструкции со значениями и всеми результатами.

Ответ 6

Я не уверен, понимаю ли я этот вопрос, но похоже, что вы хотите это увидеть:

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

Ответ 7

Я думал, что может быть полезно, если вы посмотрите, имеет ли выполняемый запрос значение или нет

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

i.e "false", возвращаемый "CallableStatement.execute()", означает, что оператор JDBC не читал никаких строк (поэтому нет ResultSet для чтения). Это то, что вы ожидаете, поскольку хранимые процедуры напрямую не возвращают ResultSets, они возвращают только значения для любых параметров OUT или INOUT.