从Oracle的Prepared Statement中获取结果sql

时间:2015-12-22 09:19:56

标签: java sql oracle prepared-statement

我正在寻找从java for Oracle实现的预准备语句中获取结果sql(带注入参数)的可能性。

通过MySQL,方法toString()需要来自asSql()的方法com.mysql.jdbc.PreparedStatement的sql。

但是通过Oracle实现oracle.jdbc.driver.OraclePreparedStatementWrapper,我找不到获取结果sql的方法。

1 个答案:

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

所以整个过程非常痛苦。