如何在Java中打印语句(CallableStatement)?

如何在Java中打印语句(CallableStatement)?,java,sql,oracle,jdbc,Java,Sql,Oracle,Jdbc,如何打印此OracleCallableStatement ocstmt = (OracleCallableStatement) connection.prepareCall("{?= call package.method(id => ?, name=>?)}"); ocstmt.registerOutParameter(1, OracleTypes.CURSOR); ocstmt.setInt(2, obj.get

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

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

您无法通过打印语句来获取SQL

您发布的示例是否属于触发错误的“有时”示例之一


你为什么要用OracleCallableStatement来证明这一点?调用的哪个部分不是标准的CallableStatement?

通常,使用myObject.toString()查看它打印的内容。但是,您可能无法看到完整的查询。如果你不能让它运行,我首先要看的是API文档(你正在使用的Oracle库或驱动程序的javadocs)

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

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

我认为,若您正在查看执行的查询是否有价值,那个么它可能会很有用

System.out.println("value : "+CallableStatement.execute());
i、 e“CallableStatement.execute()”返回的“false”表示JDBC语句没有读取任何行(因此没有要读取的ResultSet)。这是您所期望的,因为存储过程不直接返回结果集,它们只返回任何OUT或INOUT参数的值。

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

是的,您可以这样做。您可以将可调用语句包装在代理中,以便在打印时替换实际值(并显示sql),也可以查找具有有意义的toString的驱动程序。还有,等等。 存储过程更难,但仍然可行。

您使用的是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
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
如果您使用的是诸如ibatis之类的ORM框架,那么您可以像下面这样添加额外的记录器

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG

我的解决方案是使用ProxyDataSourceBuilder(在SpringBoot项目中使用它)

只需打开登录application.yml:

logging: 
    level:
      net.ttddyy.dsproxy.listener.logging: debug
试一试

>java-classpath ojdbc8.jar oracle.jdbc.driver.OracleSql false“”

这将打印驱动程序发送到数据库的SQL以及其他内容。这没有文档记录,也不受支持,但它已经存在了很久。

我给了我10分钟的时间来输入错误的sent int而不是double。这就是为什么我想在execute()之前获取sql,因为“您不能”并不完全正确。它取决于底层JDBC驱动程序,从而取决于
语句的实际实现。有些驱动程序需要实现适当的
toString()
方法,有些则没有。但Oracle没有。据我所知,我常用的所有工具(Oracle、MySQL、SQL Server和一些PostgreSQL)都没有。你能说出一些吗?是的,定制的,或者p6spy或定制包装。这是一种非常有用的技术。为什么我的SQL不能工作?因为你给它喂垃圾,而且。。。。这是你给它的垃圾。:)谢谢你的评论。我想打印sql查询,该查询使用这些值进入数据库。“插入表值('a',1,11.23.2010)”实际行为取决于底层驱动程序的支持。
 > java -classpath ojdbc8.jar oracle.jdbc.driver.OracleSql false false "<your sql here>"