2017-02-02 17 views
-2

バッチで挿入を実行するには、以下のコードを実行しています。各値のプリペードドステートメントの値を変更する方法

String idlist=1,2,3; 
PreparedStatement stmt = conn 
     .prepareStatement("INSERT INTO TEST.SAMPLE VALUES" 
       + " (?, ?, ?, ?, ?, ?, ?,?,ARRAY("+ idlist +"))"; 
for (int i = 1; i <= ITERATION_MAX; i++) { 

    idlist=listofdata.get(i).get_idlist(); 
    stmt.setInt(1, listofdata.get(i).get_id()); 
    stmt.setInt(2, listofdata.get(i).get_name()); 
    stmt.setInt(3, listofdata.get(i).get_place()); 
    stmt.setInt(4, listofdata.get(i).get_year()); 
    stmt.setInt(5, listofdata.get(i).get_day()); 
    stmt.setInt(6, listofdata.get(i).get_rollno()); 
    stmt.setInt(7, listofdata.get(i).get_main_subject()); 
    stmt.setArray(8, listofdata.get(i).get_elective()); 

    stmt.addBatch(); 
} 

    stmt.executeBatch(); 

しかし、ここではidlist(設定できません)という文字列があり、そのたびにinsert文が連結されています。

しかしidlistの値はlistofdata.get(i).get_idlist();

データ型の競合の問題(HANAデータベース)があるので、私はパラメータとして設定することはできません。だから、私はどのようにこののみ.Butでなければならないことにより、各ループ内で更新されます各ステートメントのidlist値を変更しないでください。

+0

私はSCHEMA.TABLEが、あなたが使用している名前ではなく、あなたの意図的な難読化であることを願っています。誰かがこれが非正規化スキーマであることをあなたに伝える必要があります。あなたのリストは、1:多くの親子の外部キー関係として、より正常化される可能性があります。 – duffymo

+0

私は問題が親子関係のキーの関係であることはありません。問題は、各準備文でidlistの値を更新する方法です。 – RKR

+0

正規化が何であるか分かりません。 – duffymo

答えて

1

idlistに含まれるIDの数がわからない場合は、パラメータの数が変更されたため(つまり、番号が?)、同じプリペアドステートメントを使用する方法がありません。これは、バッチ全体にわたって変更されません。

プリペアドステートメントは、まったく同じSQL文字列でのみ使用できます。

しかし、テーブルの列であるため、常に同じ数のパラメータを持つ必要があるようです。

それから、?の対応する番号のSQL文字列を作成してください。または、それらがnullable(私はそうだと思います)なら、すべての列に対して?としてください。

パラメータを設定するときには、idlistをループして、利用可能に設定し、残りのパラメータに対してnullを設定する必要があります。

関連する問題