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

问题描述 投票:20回答:8

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

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

java sql oracle jdbc
8个回答
5
投票

您是否正在使用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

3
投票

是的,您可以这样做。您可以将可调用语句包装在一个代理中,该代理可以在打印时替换实际值(并显示sql),也可以四处寻找具有有意义的toString的驱动程序。 javaworld article还有p6spy和其他。存储过程比较困难,但仍然可行。


1
投票

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

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

为什么要在OracleCallableStatement中添加大小写?呼叫的哪一部分不是标准的CallableStatement?


0
投票

通常,使用myObject.toString()查看其打印内容。不过,您可能看不到完整的查询。如果无法解决,我首先要看的是API文档(您正在使用的Oracle库或驱动程序的Javadocs)


0
投票

我不确定我是否理解这个问题,但是好像您想看到这个:

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

0
投票

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


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

-4
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.