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

时间:2011-01-11 11:57:58

标签: java sql oracle jdbc

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

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

9 个答案:

答案 0 :(得分:4)

您使用的是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

答案 1 :(得分:3)

是的,你可以这样做。您可以将可调用语句包装在代理中,该代理可以在打印时替换实际值(并显示sql),或者搜索具有有意义的toString的驱动程序。 javaworld article还有p6spy和其他人。 存储过程更难,但仍然可行。

答案 2 :(得分:1)

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

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

为什么要将这种情况归结为OracleCallableStatement?呼叫的哪个部分不是标准的CallableStatement?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

@Bean
public DataSource dataSource() {
    SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
    return ProxyDataSourceBuilder
            .create(datasource)
            .listener(loggingListener)
            .build();
}

...

@Autowired
private DataSource dataSource;

Connection connection = dataSource.getConnection();
ocstmt = (OracleCallableStatement) connection.prepareCall("{?= call 
        package.method(id => ?, name=>?)}");

然后只需打开登录application.yml:

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

答案 6 :(得分:0)

试试

 > java -classpath ojdbc8.jar oracle.jdbc.driver.OracleSql false false "<your sql here>"

这将打印驱动程序发送到数据库的 SQL,等等。这既没有记录也没有支持,但它一直存在。

答案 7 :(得分:-1)

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

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

答案 8 :(得分:-4)

我认为如果您正在查看执行的查询是否具有值

可能会有用
System.out.println("value : "+CallableStatement.execute());

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

相关问题