Как распечатать заявление (CallableStatement) в Java? - PullRequest
19 голосов
/ 11 января 2011

Как мне распечатать это 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);

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

Ответы [ 7 ]

4 голосов
/ 21 ноября 2013

Используете ли вы 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
3 голосов
/ 18 ноября 2013

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

1 голос
/ 11 января 2011

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

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

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

0 голосов
/ 12 июля 2013

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

0 голосов
/ 10 апреля 2013

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

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

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

0 голосов
/ 11 января 2011

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

  String sql = "{?= call package.method(id => ?, name=>?)}";
  System.out.println(sql);
  ocstmt = (OracleCallableStatement) connection.prepareCall(sql);
  ...
0 голосов
/ 11 января 2011

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

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