如何在Java中打印Statement(CallableStatement)?

如何打印此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); 

我的意思是我怎么知道什么查询进入数据库,我该如何打印查询? 因为有时它会给我一些错误,比如“错误的类型”,这就是为什么我要查看这个查询

你在用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),或者搜索具有有意义toString的驱动程序。 javaworld文章还有p6spy等。 存储过程更难,但仍然可行。

您无法通过打印Statement来获取SQL。

您发布的示例之一是“有时”触发错误吗?

为什么要将其置于OracleCallableStatement? 通话的哪一部分不是标准的CallableStatement?

通常,使用myObject.toString()来查看它打印的内容。 您可能会或可能不会看到完整的查询。 如果你不能理解它,我首先要看的是API文档(你正在使用的Oracle库或驱动程序的javadoc)

可以使用代理jdbc驱动程序记录所有jdbc数据库操作。 此驱动程序可以打印包含值和所有结果的所有语句。

我不确定我是否理解这个问题,但似乎你想看到这个:

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

我认为如果你正在查看执行的查询是否有价值可能会有用

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

即“CallableStatement.execute()”返回的“false”表示JDBC语句没有读取任何行(因此没有要读取的ResultSet)。 这是您所期望的,因为存储过程不直接返回ResultSet,它们只返回任何OUT或INOUT参数的值。