从Oracle SQL查询中获取结果

时间:2013-02-26 19:32:41

标签: java sql oracle oracle11g

我有这个Java对象,我将用它来存储表中的计数元素:

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

你能帮我解决这个问题吗?

更新

The SQL query works. I get this result:

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

我怀疑问题出现在返回类型中。我想我得到的结果是数组。但是,如果不使用Array,我可以以某种方式将查询结果插入到Java对象中吗?

3 个答案:

答案 0 :(得分: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课程,使String成为datacenter,而不是int

尝试

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

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

答案 1 :(得分:0)

绑定变量或INTO规范中的冒号后跟一个不合适的名称,也许是一个保留字。您需要更改变量名称并重试该操作。您是否尝试使用pl / sql或SQL plus或oracle终端从查询中获得结果?只是为了确保您正在执行正确的查询。

答案 2 :(得分:0)

SELECT语句中没有提取名为“DATACENTER”的列。它应该是在result.getInt调用中的COMPONENT_TYPE或CNT。