【问题标题】:How to get values of bind parameters from Oracle JDBC PreparedStatement object如何从 Oracle JDBC PreparedStatement 对象中获取绑定参数的值
【发布时间】:2010-11-10 23:32:06
【问题描述】:

我想在使用 Oracle JDBC 时使用实际绑定参数实现所有已执行语句的日志记录。而且我希望我可以创建这样的日志记录方法,只将 PreparedStatement 对象作为参数传递。

例如我创建了 PreparedStatement 并绑定了一个参数

PreparedStatement ps = conn.prepareStatement(
    "SELECT * FROM employees WHERE employee_id = ?");
ps.setInt(1,1);

现在我希望能够从 ps 中获取可以放入日志文件的实际 SQL 语句“SELECT * FROM employees WHERE employee_id = 1”。

到目前为止我发现我可以使用

((oracle.jdbc.driver.OracleStatement) ps).getOriginalSql()

得到

SELECT * FROM employees WHERE employe_id = ?

现在我需要一些方法来从 ps 获取当前绑定变量的列表,以便我可以替换 ?带有绑定参数值。

我试图查看 ps.getClass().getDeclaredFields() 和 ps.getClass().getSuperclass().getDeclaredFields() 但到目前为止找不到存储绑定参数值及其类型的位置。

有什么建议可以去哪里找?

【问题讨论】:

    标签: java oracle jdbc


    【解决方案1】:

    大多数日志框架都有Nested Diagnostic Context 的概念。当您填写准备好的语句时,您可以将查询及其参数保存在那里。

    或者,也许,一步完成:

    PreparedStatement fillAndLog(Connection conn, String query, Object... args) {
        int i = 0;
        PreparedStatement pstmt = conn.prepareStatement(query);
        for (Object o : args) {
           if (o instanceof String) {
               pstmt.setString(i, (String)o);
           } // else...
           i++;
        }
        log.debug(String.format(query.replaceAll("\\?", "%s"), args));
        return pstmt;
    }
    

    【讨论】:

    • 我仍然需要从 PreparedStatement 生成它。我需要一个库,除了 MySQL 和 PostgreSQL 和其他数据库之外,我还添加了 Oracle 支持,并且日志记录函数只接受 PreparedStatement 对象作为参数。在 MySQL 和 PostgreSQL JDBC 驱动程序中,如果您在 PreparedStatement 对象上调用 toString(),那么它会返回包含绑定参数的 SQL——我需要为 Oracle 实现类似的功能。
    • 那么也许改变库本身也可以这样工作?除此之外,开始调试你的 oracle 代码并中断准备好的语句。然后查看结构并找到存储值的私有位置。
    【解决方案2】:

    您可以查看p6spy,它是您的数据库驱动程序的代理,允许监控和记录。

    【讨论】:

    • 正如我对先前答案的评论,我想在一个现有库中实现 Oracle 支持,因此需要以编程方式执行此日志记录,而不是使用其他工具。
    • 仅使用 PreparedStatement 是无法做到的。如果您在 javadocs API 中没有看到,则无法执行。
    猜你喜欢
    • 2011-06-09
    • 2016-04-01
    • 1970-01-01
    • 2010-09-23
    • 2011-02-20
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多