2013-09-05 53 views
1

後,我有一個查詢ResultSet的到來爲空執行查詢

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

但結果集是空的,沒有得到result.I調試,但沒有太大的幫助?

你能不能讓我知道我在試試嗎?

在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) 
+0

假設'query'字符串確實有正確的sql語句。 – user75ponic

+0

查詢字符串具有相同的語句。我試圖在db中使用相同的語句,並將參數替換爲 – constantlearner

+0

,向我們顯示查詢字符串,因爲它是在Java內部定義的。 – Woot4Moo

回答

3

首先這打破我所見過的每個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.

UPDATE

我看到您使用RAW作爲數據類型,從此post

如Oracle JDBC開發人員指南和引用當使用RAW列時,可以將其視爲BINARY或VARBINARY JDBC類型,這意味着您可以使用返回或接受字節[]的JDBC標準方法 getBytes()和setBytes()。其他 選項是使用Oracle驅動程序特定的擴展名getRAW()和 setRAW(),它返回或接受oracle.sql.RAW。使用這兩個將 要求您展開和/或投射到特定的Oracle 實現類。

從代碼可讀性的角度來看,您的解決方案會讓新開發人員接管更加痛苦。我經常看到人們使sql成爲「動態」,實際上99%的時間你不需要動態查詢構建。這在大多數人的頭腦中聽起來不錯,但它只是在SDLC中引起痛苦和痛苦。

+0

我送這個給一些框架代碼,我不能改變他們在通用的方式設計 – constantlearner

+0

@constantlearner耶「通用」,我理解你的痛苦:( – Woot4Moo

+0

在調試器中,我可以看到我可以看到它去到別的塊,並設置字符串 – constantlearner