【问题标题】:Query from PreparedStatement从 PreparedStatement 查询
【发布时间】:2011-04-21 03:10:47
【问题描述】:

有什么方法可以从 PreparedStatement 获取 Oracle 查询。我知道这是不可能的,因为我不能使用 log4jdbc 或 p6spy,因为它是一个安全的应用程序,使用它会产生更大的问题..toString 不起作用当我使用 Oracle 时?我也无法将 PreparedStatement 更改为 Statement。

【问题讨论】:

  • 如果你不能改变代码,也不能更新配置来使用log4jdbc,你将如何访问准备好的语句?

标签: java oracle prepared-statement


【解决方案1】:

如果你只是想查看SQL语句也可以直接进入数据库查看v$sql表。

在那里你可以找到关于查询的所有 sql 和其他信息。更多信息:http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2113.htm

【讨论】:

    【解决方案2】:

    我认为您不应该这样做,因为没有正式记录的 API。

    如果你能弄乱代码,为什么不能使用 log4jdbc ? Oracle JDBC 还有supports java.util.logging,您可以尝试启用它。

    如果您只是对 SQL 本身感兴趣,可以在 Oracle 服务器上打开会话跟踪。

    或者也许您可以将您的代码放在准备语句的位置(使用类似@pinichi 的建议)?

    但只是为了好玩,用我的 Oracle JDBC 版本调试调试器,我可以做到

      if (stmt instanceof oracle.jdbc.driver.OraclePreparedStatement) {
            String x = ((oracle.jdbc.driver.OraclePreparedStatement) stmt)
                 .getOriginalSql();
            System.out.println(x);
      }
    

    【讨论】:

    • 这至少对 Oracle 10g 不起作用,仍然打印 ?
    • 打印“?”有什么问题? ?这就是 Oracle 看到的查询(可能 ? 被替换为 :1)。你还期待什么?
    • 嗯,就像原来的问题一样,我希望修改后的 SQL(?替换为参数集)否则在 PreparedStatement 上调用 toString() 就足够了。
    • 问题中没有这样说。根据使用的驱动程序toString 可以打印PreparedStatement@0xbdf1234。并且占位符不会被驱动程序或数据库的参数替换,它们在单独的数据结构(绑定数组)中传递。能够对多组参数重复使用同一语句是准备语句的重点。
    • Thilo,原来的问题确实要求“修改后的 SQL”,请再读一遍。确实取决于驱动程序。另请参阅stackoverflow.com/questions/3038523/…。
    【解决方案3】:

    如果只需要调试时间,那么您可以使用 DebuggableStatement 遵循此article

    【讨论】:

    • 是的,但这需要他更改所有准备语句的地方。我假设他不能这样做(顺便说一句,为什么不呢?)。
    • 不,我能做到 :) 还是谢谢
    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 2021-08-11
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多