【问题标题】:ResultSet coming as empty after executing query执行查询后结果集为空
【发布时间】:2013-09-05 20:31:30
【问题描述】:

我有一个问题

SELECT instance_guid FROM service_instances WHERE service_template_guid='E578F99360A86E4EE043C28DE50A1D84' AND service_family_name='TEST'

直接执行返回我

4FEFDE7671A760A8DC8FC63CFBFC8316
F2F9DF641D8E2CACC03175A7A628D51D

现在我正在尝试来自 JDBC 的相同代码。

 PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = executionContext.getConnection();
            if (conn != null) {
                ps = (PreparedStatement)conn.prepareStatement(query);
                if (params == null) params = new Object[0];
                for (int i=0;i<params.length;i++) {
                    if (params[i] instanceof Integer) {
                        ps.setInt(i+1, ((Integer)params[i]).intValue());
                    } else if (params[i] instanceof java.util.Date) {                        
                        ((PreparedStatement)ps).setDATE(i+1, new oracle.sql.DATE((new java.sql.Timestamp(((Date)params[i]).getTime()))));
                        //ps.setObject(i+1, new oracle.sql.DATE(new Time(((Date)params[i]).getTime())));
                    } else {
                        if (params[i] == null) params[i] = "";
                        ps.setString(i+1, params[i].toString());
                    }
                }

                rs = ps.executeQuery();

我看到params[0] =E578F99360A86E4EE043C28DE50A1D84 and params[1]=TEST

但是resultSet是空的,没有得到结果。我调试了但没有太大帮助?

你能告诉我我尝试对了吗?

在java中定义如下

  final static private String INSTANCE_GUID_BY_TEMPLATE_GUID = 
    "SELECT instance_guid FROM service_instances WHERE service_template_guid=? AND service_family_name=? "

SERVICE_FAMILY_NAME          NOT NULL VARCHAR2(256)  
SERVICE_TEMPLATE_GUID        NOT NULL RAW(16 BYTE)  

【问题讨论】:

  • 假设query字符串确实有正确的sql语句。
  • 查询字符串具有相同的语句。我正在尝试在 db 中替换参数的相同语句
  • 请向我们展示在 Java 中定义的查询字符串。
  • @constantlearner SERVICE_TEMPLATE_GUIDRAW 类型并且有 RAW 数据类型设置方法吗?
  • @Polppan 如果 OP 使用 setRAW/getRAW,他将绑定到 oracle JDBC 驱动程序。我在下面的帖子解决了这个问题。

标签: sql jdbc


【解决方案1】:

首先,这打破了我见过的所有 sql 映射模式。

String sql = "SELECT instance_guid FROM service_instances WHERE service_template_guid=? AND service_family_name=?";
PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = executionContext.getConnection();  
            ps = conn.prepareStatement(sql);  
            ps.setString(1,guid);  
            ps.setString(2,family);  
            rs = ps.executeQuery();  
            while(rs.next(){...}  
           ...  
       }

您不应该在数据类型进入时动态地确定它们,除非您尝试编写一些代码来从数据库 X 移植到数据库 Y。

更新

我看到您正在使用 RAW 作为数据类型,来自 post:

如 Oracle JDBC 开发人员指南和参考 11g 中所述, 使用 RAW 列时,可以将其视为 BINARY 或 VARBINARY JDBC 类型,表示可以使用 JDBC 标准方法 getBytes() 和 setBytes() 返回或接受一个字节[]。另一个 选项是使用 Oracle 驱动程序特定的扩展 getRAW() 和 setRAW() 返回或接受 oracle.sql.RAW。使用这两个将 要求您解包和/或转换为特定的 Oracle 实现类。

进一步从代码可读性的角度来看,您的解决方案会让新开发人员接管工作变得痛苦。我经常看到人们让 sql 变得“动态”,而实际上 99% 的时间你不需要这种级别的动态查询构建。在大多数人看来这听起来不错,但它只会在 SDLC 中引起痛苦和痛苦。

【讨论】:

  • 我将其发送到一些我无法更改的框架代码,它们以通用方式设计
  • 在调试器中我可以看到我可以看到它去 else 块并设置字符串
  • @constantlearner 尝试从我所布置的主程序运行它,看看它是否有效,如果有效,则可能意味着框架已被破坏。
  • 我正在为相同的通用框架发送其他查询。它工作正常。Final static private String TEMPLATE_NAME = "SELECT SERVICE_NAME FROM service_templates WHERE service_template_guid=?" service_template_guid 的类型为 raw
猜你喜欢
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多