从 Oracle SQL 查询中获取结果

Posted

技术标签:

【中文标题】从 Oracle SQL 查询中获取结果【英文标题】:Get result from Oracle SQL query 【发布时间】:2013-02-26 19:32:40 【问题描述】:

我有这个 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   

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

【问题讨论】:

Worth reading 您的 SQL 语句返回一个包含两列的结果集,COMPONENT_TYPECNT。您是否尝试从结果的第一行中检索其中一个列的值并将其传递给您的 DCDataObj 构造函数?如果是这样,您是否尝试检索CNT?还是COMPONENT_TYPE?我的猜测是CNT 是的,我只需要CNT 【参考方案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 类更改为为 datacenter 提供 String,而不是 int

试试

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

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

【讨论】:

您对 getInt 的调用错误地引用了您的数据而不是列标题名称。我已经编辑了答案以添加解释。 我编辑了代码,但现在我收到了这个错误java.sql.SQLException: Invalid column index 您正在尝试获取第 3 列,但您在查询中只定义了 2 列。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于从 Oracle SQL 查询中获取结果的主要内容,如果未能解决你的问题,请参考以下文章

从 Oracle 中的动态 SQL 获取结果集中的结果

如何从 Oracle SQL 中的 BLOB 获取文本内容

Oracle sql查询需要根据时区变化

Oracle查询从多维表中获取关系数据集结果

oracle sql Developer花时间获取所有记录

如何从原始查询中获取 sql 结果