query - ¿Cómo imprimir Statement(CallableStatement) en Java?
ejecutar stored procedure oracle desde java (7)
¿Cómo puedo imprimir este 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);
Lo que quiero decir es cómo puedo saber que consulta va a la base de datos, ¿cómo puedo imprimir la consulta? porque a veces me da un error como "Tipo incorrecto", por eso quiero ver esta consulta
¿Estás utilizando log4j?
Si es así, agregue registradores para sql como abajo.
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
Si está utilizando un marco ORM como ibatis, puede agregar un registrador adicional como el siguiente.
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
En general, use myObject.toString () para ver qué imprime. Aunque puede o no ser capaz de ver la consulta completa. Si no puedes hacerlo funcionar, lo primero que vería es la documentación de la API (javadocs para esa biblioteca o controlador de Oracle que estás usando)
Es posible usar el controlador proxy jdbc para registrar todas las acciones de la base de datos jdbc. Este controlador puede imprimir todas las declaraciones con valores y todos los resultados.
No estoy seguro si entiendo la pregunta, pero parece que quieres ver esto:
String sql = "{?= call package.method(id => ?, name=>?)}";
System.out.println(sql);
ocstmt = (OracleCallableStatement) connection.prepareCall(sql);
...
No puede obtener el SQL imprimiendo la declaración.
¿Es el ejemplo que publicó uno de los "a veces" que dispara el error?
¿Por qué tiene que incluir esto en una sentencia OracleCallableStatement? ¿Qué parte de la llamada no es la declaración estándar de Callable?
Pensé que podría ser útil si está buscando si la consulta ejecutada tiene valor o no
System.out.println("value : "+CallableStatement.execute());
es decir, "falso" devuelto por "CallableStatement.execute ()" significa que la declaración JDBC no leyó ninguna fila, (por lo tanto, no hay un ResultSet para leer). Esto es lo que cabría esperar, ya que los procedimientos almacenados no devuelven directamente ResultSets, solo devuelven valores para cualquier parámetro OUT o INOUT.
Sí, usted puede hacer esto. Puede envolver su declaración invocable en un proxy que pueda sustituir los valores reales cuando lo imprima (y muestre el sql), o buscar un controlador que tenga una cadena de caracteres significativa. Artículo de javaworld También hay p6spy , y otros. Los procedimientos almacenados son más difíciles, pero aún son factibles.