0

テーブルからカウントされた要素を格納するために使用するこの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オブジェクトに挿入することはできますか?

4

3 に答える 3

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の代わりに使用してくださいgetIntDCDataObjこれは、クラスを変更して、ではなくStringforを使用する必要があることも意味します。datacenterint

試す

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

また

dc = new DCDataObj(
   result.getString(1),
   ...........
   );
于 2013-02-26T19:36:53.257 に答える
0

バインド変数またはINTO仕様のコロンの後に、不適切な名前、おそらく予約語が続きました。変数名を変更して、操作を再試行する必要があります。pl /sqlまたはSQLplusまたはOracleターミナルを使用してクエリから結果を取得しようとしましたか?正しいクエリを実行していることを確認するためだけに。

于 2013-02-26T19:35:04.863 に答える
0

SELECTステートメントでフェッチされた「DATACENTER」という列はありません。result.getInt呼び出しでは、COMPONENT_TYPEまたはCNTのいずれかである必要があります。

于 2013-02-26T20:05:10.963 に答える