我正在尋找可能性來獲取結果sql(與注入的參數)從java執行Oracle語句中準備語句。Oracle準備好的聲明中獲得結果sql
通過MySQL的方法toString()
通過方法asSql()
從com.mysql.jdbc.PreparedStatement
得到想要的sql。
但通過Oracle實現oracle.jdbc.driver.OraclePreparedStatementWrapper
,我找不到獲取結果sql的方式。
我正在尋找可能性來獲取結果sql(與注入的參數)從java執行Oracle語句中準備語句。Oracle準備好的聲明中獲得結果sql
通過MySQL的方法toString()
通過方法asSql()
從com.mysql.jdbc.PreparedStatement
得到想要的sql。
但通過Oracle實現oracle.jdbc.driver.OraclePreparedStatementWrapper
,我找不到獲取結果sql的方式。
我相信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);
因此整個過程是相當痛苦。
我有一種感覺,Oracle驅動程序中沒有這種東西。你可能最終會自己做(寫一個關於Oracle的PreparedStatement的包裝?) – Jan
如果我理解你的話,方法是注入我的包裝並自行構建SQL,用值替換屬性? – Mark