如何打印此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);
我的意思是我怎么知道什么查询进入数据库,我该如何打印查询?因为有时它会给我一些错误,比如“错误的类型”,这就是为什么我要查看这个查询
答案 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参数的值。