2015-12-22 99 views
2

我正在尋找可能性來獲取結果sql(與注入的參數)從java執行Oracle語句中準備語句。Oracle準備好的聲明中獲得結果sql

通過MySQL的方法toString()通過方法asSql()com.mysql.jdbc.PreparedStatement得到想要的sql。

但通過Oracle實現oracle.jdbc.driver.OraclePreparedStatementWrapper,我找不到獲取結果sql的方式。

+0

我有一種感覺,Oracle驅動程序中沒有這種東西。你可能最終會自己做(寫一個關於Oracle的PreparedStatement的包裝?) – Jan

+0

如果我理解你的話,方法是注入我的包裝並自行構建SQL,用值替換屬性? – Mark

回答

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); 

因此整個過程是相當痛苦。

+0

你認爲整數和char參數有什麼區別?是否不需要用撇號超越char參數(和日期參數)? – Mark

+0

因爲您可以爲所有參數添加大量'instanceof'檢查,然後調整打印輸出以添加該參數。但這是「這是提交的查詢」日誌輸出只,對吧?您不會嘗試執行由此聲明打印的查詢嗎? – Jan

+0

我需要它進行調試。當sql語句拋出錯誤時,我會拿它並在DbVisualizer中運行以簡化調試。 – Mark