我正在寻找从java for Oracle实现的预准备语句中获取结果sql(带注入参数)的可能性。
通过MySQL,方法toString()
需要来自asSql()
的方法com.mysql.jdbc.PreparedStatement
的sql。
但是通过Oracle实现oracle.jdbc.driver.OraclePreparedStatementWrapper
,我找不到获取结果sql的方法。
答案 0 :(得分:1)
我相信OraclePreparedStatement
没有这样的事情。
如果您绝对需要该功能,您可以在PreparedStatement周围包装一些代码:
public class LoggingPreparedStatement implements PreparedStatement {
private PreparedStatement delegate;
private String sql;
private Map<Integer,Object> parameter = new TreeMap<Integer,Object>();
public LoggingPreparedStatement(Connection con, String sql) throws SQLException {
this.sql = sql;
this.delegate = con.prepareStatement(sql);
}
@Override
public void setString(int parameterIndex, String x) throws SQLException {
parameter.put(parameterIndex, x);
delegate.setString(parameterIndex, x);
}
//What you asked for
public String getSQL() {
String returnSQL = sql;
//TreeMap returns sorted by key
for(Object o : parameter.values()) {
//Replace first ? with the value
returnSQL = returnSQL.replaceFirst("\\?", o.toString());
}
return returnSQL;
}
//Lots of other methods to implement and delegate to original statement
[...]
}
然后你将代替
PreparedStatement ps = con.prepareStatement(sql);
需要更改为
LoggingPreparedStatement ps = new LoggingPreparedStatement(con, sql);
所以整个过程非常痛苦。