我如何打印此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 article还有p6spy和其他。存储过程比较困难,但仍然可行。
您无法通过打印Statement获取SQL。
示例是您发布触发错误的“有时”之一吗?
为什么要在OracleCallableStatement中添加大小写?呼叫的哪一部分不是标准的CallableStatement?
通常,使用myObject.toString()查看其打印内容。不过,您可能看不到完整的查询。如果无法解决,我首先要看的是API文档(您正在使用的Oracle库或驱动程序的Javadocs)
我不确定我是否理解这个问题,但是好像您想看到这个:
String sql = "{?= call package.method(id => ?, name=>?)}";
System.out.println(sql);
ocstmt = (OracleCallableStatement) connection.prepareCall(sql);
...
可以使用proxy jdbc driver记录所有jdbc数据库操作。该驱动程序可以打印所有带有值和所有结果的语句。
我的解决方案是使用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
我认为如果您查看执行的查询是否有价值,可能会有用
System.out.println("value : "+CallableStatement.execute());
即“ CallableStatement.execute()”返回的“ false”表示JDBC语句未读取任何行(因此没有要读取的ResultSet)。这就是您所期望的,因为存储过程不会直接返回ResultSet,它们只会返回任何OUT或INOUT参数的值。