【问题标题】:how to print Statement (CallableStatement) in Java?如何在 Java 中打印语句(CallableStatement)?
【发布时间】:2011-06-07 03:21:28
【问题描述】:

如何打印这个 OracleCallableStatement ?

   ocstmt = (OracleCallableStatement) connection.prepareCall("{?= call 
            package.method(id => ?, name=>?)}");
   ocstmt.registerOutParameter(1, OracleTypes.CURSOR);            
   ocstmt.setInt(2, obj.getId());
   ocstmt.setString(3, obj.getName());
   ocstmt.execute();
   resultSet = ocstmt.getCursor(1);

我的意思是我怎么知道什么查询进入数据库,我如何打印查询?因为有时它会给我诸如“错误类型”之类的错误,这就是我想查看此查询的原因

【问题讨论】:

    标签: java sql oracle jdbc


    【解决方案1】:

    试试

     > java -classpath ojdbc8.jar oracle.jdbc.driver.OracleSql false false "<your sql here>"
    

    这将打印驱动程序发送到数据库的 SQL 等等。这既没有记录也没有得到支持,但它一直存在。

    【讨论】:

      【解决方案2】:

      是的,您可以这样做。您可以将可调用语句包装在代理中,该代理可以在打印时替换实际值(并显示 sql),或者四处寻找具有有意义的 toString 的驱动程序。 javaworld article 还有p6spy 等。 存储过程更难,但仍然可行。

      【讨论】:

        【解决方案3】:

        我的解决方案是使用 ProxyDataSourceBuilder(在 Spring Boot 项目中使用它)。

        @Bean
        public DataSource dataSource() {
            SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
            return ProxyDataSourceBuilder
                    .create(datasource)
                    .listener(loggingListener)
                    .build();
        }
        

        ...

        @Autowired
        private DataSource dataSource;
        
        Connection connection = dataSource.getConnection();
        ocstmt = (OracleCallableStatement) connection.prepareCall("{?= call 
                package.method(id => ?, name=>?)}");
        

        然后在 application.yml 中打开登录:

        logging: 
            level:
              net.ttddyy.dsproxy.listener.logging: debug
        

        【讨论】:

          【解决方案4】:

          你在用 log4j 吗?

          如果是这样,请为 sql 添加记录器,如下所示。

          log4j.logger.java.sql.Connection=DEBUG
          log4j.logger.java.sql.Statement=DEBUG
          log4j.logger.java.sql.PreparedStatement=DEBUG
          log4j.logger.java.sql.ResultSet=DEBUG
          

          如果您使用的是 ibatis 等 ORM 框架,您可以添加额外的记录器,如下所示。

          log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
          

          【讨论】:

          • 实际行为取决于底层驱动的支持。
          【解决方案5】:

          可以使用proxy jdbc driver 记录所有 jdbc 数据库操作。 此驱动程序可以打印所有带有值和所有结果的语句。

          【讨论】:

            【解决方案6】:

            我认为如果您正在查看执行的查询是否有价值,这可能会很有用

            System.out.println("value : "+CallableStatement.execute());
            

            即“CallableStatement.execute()”返回的“false”表示 JDBC 语句没有读取任何行,(因此没有要读取的 ResultSet)。这是您所期望的,因为存储过程不直接返回 ResultSet,它们只返回任何 OUT 或 INOUT 参数的值。

            【讨论】:

              【解决方案7】:

              我不确定我是否理解这个问题,但您似乎想看到这个:

                String sql = "{?= call package.method(id => ?, name=>?)}";
                System.out.println(sql);
                ocstmt = (OracleCallableStatement) connection.prepareCall(sql);
                ...
              

              【讨论】:

              • 感谢您的评论。我想打印带有值的 sql 查询。 "插入表值('a', 1, 11.23.2010)"
              【解决方案8】:

              一般来说,使用 myObject.toString() 来查看它打印的内容。不过,您可能会也可能不会看到完整的查询。如果您无法启动它,我首先要看的是 API 文档(您正在使用的那个 Oracle 库或驱动程序的 javadocs)

              【讨论】:

                【解决方案9】:

                您无法通过打印语句来获取 SQL。

                您发布的示例是触发错误的“有时”之一吗?

                为什么你必须将它提交给 OracleCallableStatement?调用的哪一部分不是标准的 CallableStatement?

                【讨论】:

                • 我给了我 10 分钟的错误类型发送 int 而不是 double。这就是为什么我想在 execute() 之前获取 sql
                • 你不能”不太正确。它取决于底层的 JDBC 驱动程序,因此也取决于 Statement 接口的实际实现。有些驱动程序实现了正确的toString() 方法,有些则没有。但是甲骨文没有。
                • 据我所知,所有我常用的都不是(Oracle、MySQL、SQL Server、一些 PostgreSQL)。你能说出其中的一些吗?
                • 是的,自定义的,或 p6spy 或自定义包装器。这是一种非常有用的技术。为什么我的 SQL 不起作用?因为你给它喂了垃圾,而且……这是你给它的垃圾。 :)
                猜你喜欢
                • 1970-01-01
                • 2011-04-03
                • 2015-09-13
                • 1970-01-01
                • 1970-01-01
                • 2021-06-23
                • 1970-01-01
                • 1970-01-01
                • 2023-03-25
                相关资源
                最近更新 更多