2013-02-26 93 views
0

我有,我會用它來計算元素存儲從表這個Java對象:從Oracle SQL查詢中獲取引起

private DCDataObj dc; 

    public class DCDataObj 
    { 

     private int datacenter;    // Datacenters 
     ............. 

     public DCDataObj() 
     { 
     } 

     public DCDataObj(int datacenter..........) 
     { 
      this.datacenter = datacenter; 
      .......... 
     } 

     public int getDatacenter() 
     { 
      return datacenter; 
     } 

     public void setDatacenter(int datacenter) 
     { 
      this.datacenter = datacenter; 
     } 

     .......... 
    } 

我用這個SQL查詢來算的組件集成到Oracle表:

ps = conn.prepareStatement("SELECT COUNT(1) AS CNT FROM COMPONENTSTATS CS, COMPONENTTYPE CT " 
    + " WHERE CS.COMPONENTTYPEID = CT.COMPONENTTYPEID AND CT.COMPONENTTYPEID IN (" 
    + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ? " // 10 
    + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ? " // 20 
    + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ? " // 30 
    + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " // 40 
    + " GROUP BY CT.NAME ORDER BY CT.NAME"); 

ps.setInt(1, 1000); 
...... 

我得到這個使用Java代碼的結果:

ResultSet result = ps.executeQuery(); 
while (result.next()) 
{ 

    dc = new DCDataObj(
      result.getInt(1), 
      result.getInt(2), 
      result.getInt(3), 
      ........... 
      ); 

} 

我得到這個問題,當我執行查詢:

java.sql.SQLException: Invalid column index 

你能幫我解決這個問題嗎?

UPDATE

The SQL query works. I get this result: 

    CNT      
---------------------- 
1      
1      
1 1 

我懷疑,這個問題是到返回類型。我想我得到的結果作爲數組。但是,我可以以某種方式將查詢結果插入Java對象而不使用Array?

+0

[值得閱讀](http://oraclequirks.blogspot.in/2008/04/sql-error-ora-01745-invalid-hostbind.html) – 2013-02-26 19:35:39

+0

您的SQL語句返回一個結果集,其中包含兩列「COMPONENT_TYPE '和'CNT'。你是否試圖從結果的第一行中檢索其中一列的值並將其傳遞給你的'DCDataObj'構造函數?如果是這樣,你想要檢索'CNT'嗎?或者'COMPONENT_TYPE'?我的猜測是'CNT'。 – 2013-02-26 19:37:20

+0

是的,我只需要'CNT'。 – 2013-02-26 19:48:59

回答

1

在每一行,你用「?」結束但下一行以另一個「?」開始沒有逗號。然後你會看到部分字符串,看起來像「,??」,這是無效的JDBC語法。你需要逗號在你所有的「?」之間佔位符。

試試這個,用逗號你行「10」,「20」和「30」的末尾。

ps = conn.prepareStatement("SELECT CT.NAME AS COMPONENT_TYPE, COUNT(1) AS CNT FROM COMPONENTSTATS CS, COMPONENTTYPE CT " 
    + " WHERE CS.COMPONENTTYPEID = CT.COMPONENTTYPEID AND CT.COMPONENTTYPEID IN (" 
    + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " // 10 
    + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " // 20 
    + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " // 30 
    + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " // 40 
    + " GROUP BY CT.NAME ORDER BY CT.NAME"); 

編輯

現在,我看到你的數據,我看到的問題。您不能調用getInt引用數據,只能調用列標題名稱或基於1的列索引。另外,您的「COMPONENT_TYPE」爲字母數字,請使用getString而不是getInt。這也意味着你必須改變你的DCDataObj類有Stringdatacenter,而不是int

嘗試

dc = new DCDataObj(
    result.getString("COMPONENT_TYPE"), 
    ........... 
    ); 

dc = new DCDataObj(
    result.getString(1), 
    ........... 
    ); 
+0

您對getInt的調用錯誤地引用了您的數據而不是列標題名稱。我編輯了我的答案以添加解釋。 – rgettman 2013-02-26 19:52:47

+0

我編輯了代碼,但現在出現此錯誤:'java.sql.SQLException:列索引無效' – 2013-02-26 20:02:41

+0

您試圖獲得第3列,但您只在查詢中定義了2列。 – rgettman 2013-02-26 20:11:21

0

在綁定變量或INTO規範冒號之後是不合適的名稱,可能是一個保留字。您需要更改變量名稱並重試操作。您是否嘗試使用pl/sql或SQL plus或oracle終端從您的查詢中獲得結果?只是爲了確保你正在執行正確的查詢。

+0

是的,我更新了這篇文章。 – 2013-02-26 20:09:53

0

沒有名爲 「DATACENTER」 在SELECT語句獲取列。它應該是result.getInt調用中的COMPONENT_TYPE或CNT。

+0

是的,我更新了帖子 – 2013-02-26 20:08:39