如何在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参数的值。