2011-01-11 20 views
17

¿Cómo puedo imprimir este OracleCallableStatement?cómo imprimir Statement (CallableStatement) en Java?

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 qué consulta va a la base de datos, ¿cómo puedo imprimir la consulta? porque a veces me da error como "Tipo incorrecto" es por eso que quiero mirar a esta consulta

Respuesta

1

No se puede obtener el SQL mediante la impresión de la Declaración.

Es el ejemplo en el que ha publicado una de las "veces" que desencadena el error?

¿Por qué tiene que incluir esto en OracleCallableStatement? ¿Qué parte de la llamada no es el CallableStatement estándar?

+0

Doy mis 10 minutos al tipo incorrecto enviado int en lugar de doble. Es por eso que quiero obtener SQL antes de ejecutar() –

+0

"* no se puede *" no es del todo correcto. Depende del controlador JDBC subyacente y, por lo tanto, de la implementación real de la interfaz 'Statement'. Algunos controladores implementan un método 'toString()' adecuado, otros no. Oracle no obstante. –

+0

No conozco ninguno de los que uso habitualmente (Oracle, MySQL, SQL Server, algunos PostgreSQL). ¿Puedes nombrar algunos que sí? – duffymo

0

En general, use myObject.toString() para ver qué imprime. Puede o no poder ver la consulta completa sin embargo. Si no puede hacerlo, lo primero que vería es la documentación de la API (javadocs para esa biblioteca o controlador de Oracle que esté usando)

+0

He intentado todo esto.gracias por su comentario –

-1

No estoy seguro si entiendo la pregunta , pero parece que quiere ver esto:

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

gracias por su comentario. Quiero imprimir la consulta sql que va a la base de datos con los valores. "Insertar en los valores de la tabla ('a', 1, 11.23.2010)" –

+1

Hola, ¿has logrado hacerlo? – rayman

-3

pensé que podría ser útil si usted está buscando si consulta ejecutada tiene valor o no

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

es decir, el "falso" que devuelve " CallableStatement.execute() "significa que la instrucción JDBC no leyó ninguna fila (por lo que no hay ningún resultado) et para leer). Esto es lo que esperaría, ya que los procedimientos almacenados no devuelven ResultSets directamente, solo devuelven valores para cualquier parámetro OUT o INOUT.

+0

No creo que aborde la pregunta, pero gracias. – duffymo

0

Es posible utilizar proxy jdbc driver para registrar todas las acciones de base de datos JDBC. este controlador puede imprimir todas las declaraciones con valores y todos los resultados.

3

Sí, puedes 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 un significado para toString. javaworld article También hay p6spy, y otros. Los procedimientos almacenados son más difíciles, pero todavía factibles.

4

¿Estás utilizando log4j?

Si es así, agregue los registradores para sql como a continuación.

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 una estructura ORM como ibatis, puede agregar registradores adicionales como a continuación.

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

El comportamiento real depende del soporte del controlador subyacente. – ggb667