2017-01-24 15 views
1

У меня есть объект массива объектов и пытается вставить список в HANA. Так что мой вставки код выглядитВставить массив в HANA с JAVA

PreparedStatement stmt = conn 
     .prepareStatement("INSERT INTO SCHEMA.TABLE VALUES" 
       + " (?, ?, ?, ?, ?, ?, ?, ARRAY("+"1,2,3"+")"); 

for (int i = 1; i <= ITERATION_MAX; i++) { 

    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(); 

Здесь
listofdata.get(i).get_elective()

возвращает целочисленный массив.

Но это не работает. По моей программе функция ARRAY вызывается каждый раз, но почему она не вставляет в базу данных HANA. Через некоторое время я понял, что мне нужно преобразовать массив JAVA в массив HANA. Как я могу преобразовать массив Java в массив HANA. Любая помощь приветствуется.

+2

проверить это [ссылка] (http://stackoverflow.com/a/41673091/1770155) – PWC

+0

Теперь мой вопрос, как преобразовать массив Java в массив HANA? – RKR

+1

Это итерация обсуждения, которое мы имели в http://stackoverflow.com/questions/41677436/is-it-possible-bulk-insert-in-hana. Пожалуйста, следуйте ссылкам SO, которые я разместил там. –

ответ

2

@RKR нормально, здесь у вас есть пример:

 /* 
    * We're goin to insert several arrays into the HANA table, 
    * with different lengths 
    * 
    * let's assume we already got a table like this 
    * CREATE COLUMN TABLE T3 (ID INT PRIMARY KEY, C1 INT ARRAY); 
    */ 

    Integer[][] myarr ={ {1}, {1,2}, {1,2,3,4,5}, {1,2}, {1,2,3} }; 

    String testSection = "Insert Arrays one by one"; 
    stopWatch.start(testSection); 
    myDBconn.setAutoCommit(false); 

    Statement stmt = myDBconn.createStatement(); 

    stmt = myDBconn.createStatement(); 

    stmt.execute("TRUNCATE TABLE DEVDUDE.T3"); 

    // loop over our array of arrays and visit each once 
    for (int i = 0 ; i < (myarr.length); i++) { 
     int curr_length = myarr[i].length; 

     String arrayFunction = "ARRAY ("; 

     for (int j = 0; j < (curr_length); j++){ 

      arrayFunction = arrayFunction.concat(myarr[i][j].toString()) ; 

      // add comma if this is not the last element 
      if (j < (curr_length - 1)){ 
       arrayFunction = arrayFunction.concat(", ") ; 
      } 
     } 

     arrayFunction = arrayFunction + ")" ; 
     // now the arrayFunction should loook like this 
     // ARRAY (..., .... ,...) 

     String insCMD = "INSERT INTO T3 (id, c1) " 
         + " VALUES (" + i + ", " 
         + arrayFunction 
         + ") "; 

     System.out.println(insCMD); 
     int affectedRows = stmt.executeUpdate(insCMD); 

     System.out.println("Loop round " + i 
        + ", last affected row count " + affectedRows); 
     } 


    myDBconn.commit(); 
    stmt.close(); 
    stmt = null; 

И нет, этот код не санировать вход на заявление INSERT, но это должно быть сделано для того, чтобы избежать инъекции SQL.

Когда я запускаю код это то, что печатается:

INSERT INTO T3 (id, c1) VALUES (0, ARRAY (1)) 
Loop round 0, last affected row count 1 
INSERT INTO T3 (id, c1) VALUES (1, ARRAY (1, 2)) 
Loop round 1, last affected row count 1 
INSERT INTO T3 (id, c1) VALUES (2, ARRAY (1, 2, 3, 4, 5)) 
Loop round 2, last affected row count 1 
INSERT INTO T3 (id, c1) VALUES (3, ARRAY (1, 2)) 
Loop round 3, last affected row count 1 
INSERT INTO T3 (id, c1) VALUES (4, ARRAY (1, 2, 3)) 
Loop round 4, last affected row count 1 

И ВЫБРАТЬ на возвращениях таблицы:

ID C1   
0 1    
1 1, 2   
2 1, 2, 3, 4, 5 
3 1, 2   
4 1, 2, 3  
+0

Наконец-то я тоже понял это. Как и у вас, но вы сделали более формально, где я преобразовал весь массив в String с помощью 'Arrays.toString (arr)' и просто конкатенирован с '" "+ +" "' .Indeed your method является более стандартным и будет полезен и для других, которые искали такое же решение. Очень любезно с вашей стороны дать ясное объяснение по коду – RKR

1

Это не стандартный код, но все еще работает fine.Hope это помогает кому угодно.

for (int i = 1; i <= ITERATION_MAX; i++) { 

     String arraylist=Arrays.toString(listofdata.get(i).get_arraylist.replace("[","").replace("]","")); 
     id=listofdata.get(i).get_id(); 
     name= listofdata.get(i).get_name(); 
     place=listofdata.get(i).get_place(); 
     year= listofdata.get(i).get_year(); 
     day=listofdata.get(i).get_day(); 
     rollno= listofdata.get(i).get_rollno(); 
     main_subject= listofdata.get(i).get_main_subject(); 
     elective= listofdata.get(i).get_elective(); 
     Statement stmt = conn.createStatement(); 
     String sql="INSERT INTO SCHEMA.TABLE values("+ 

      +name+"," 
      place+"," 
      year+day+"," 
      rollno+"," 
      main_subject+"," 
      elective"+"," 
      "ARRAY("+arraylist+")" ; 


     stmt.addbatch(sql); 
    } 
    stmt.executeBatch(); 
    stmt.close(); 
    conn.commit(); 
    conn.close(); 
+0

@Lars Br. Вышеприведенный код работает отлично для меня, но для загрузки всего 1 миллион строк (даже в пакетной вставке) требуется около 1 часа, что я считаю не совсем импрессивным. Можно ли это решить? – RKR