Как вставить массив в цикле в базу данных

Я хочу вставить набор массивов в базу данных (HANA) в цикле. Мой код приведен ниже:

public class jdemo {
   public static void main(String[] args) {
      Connection connection = null;
      try {                  
         connection = DriverManager.getConnection(
            "jdbc:sap://myhdb:30715/?autocommit=false",myname,mysecret);                  
      } catch (SQLException e) {
         System.err.println("Connection Failed. User/Passwd Error?");
         return;
      }
      if (connection != null) {
         try {
            int [] array=new int []{1,2,3};
            Array array1= connection.createArrayof("Integer",array)
            System.out.println("Connection to HANA successful!");
            String sql="INSERT INTO TABLE1 VALUES(1,ARRAY(?))"
            PreparedStatement stmt = connection.createStatement(sql);
            stmt.setArray(int,array1);
            stmt.executeUpdate(sql);

       } catch (SQLException e) {
          System.err.println("Query failed!");
       }
     }
   }
}

Но это не работает. Я пробовал с

Object [] array=new Object []{1,2,3};

Этот возвращенный метод создания массива Connection не поддерживается.

Моя схема таблицы выглядит так

ID   MARK
__   ____
10  {1,2,3}
11  {3,2,3}
12  {9,2,3}
13  {10,2,3}
14  {12,24,3}
18  {1,27,3}

Я также хочу, чтобы мой тип данных в виде целочисленного массива. Любая помощь приветствуется.

3 ответа

Решение

Тема "вставки в массив HANA" уже обсуждалась здесь, на SO, несколько раз. HANA поддерживает хранение массивов только через функцию ARRAY(). Эта функция не принимает список в качестве параметра, а только отдельные элементы.

Итак, вместо

 String sql="INSERT INTO TABLE1 VALUES(1,ARRAY(?))"

ты должен был бы написать

String sql="INSERT INTO TABLE1 VALUES(1, ARRAY( 1, 2, 3))"

Для драйвера JDBC: HANA JDBC автоматически не обрабатывает JAVA-массивы в HANA-массивы - это то, что разработчик должен будет сделать вручную. (да, это не приятно, я знаю).

Короче говоря: в настоящее время (HANA 1.0 SP12) массивы в основном могут использоваться для внутренних целей (в рамках хранимой процедуры), но они не являются типами данных первого класса. (<- это мое мнение!)

Просто идея:
Вместо того, чтобы хранить массив в вашем столбце, вы можете сохранить строку, разделенную двоеточиями. Когда вы запрашиваете данные из вашей базы данных, вы можете использовать split (","), и у вас автоматически будет нужный массив (после Integer.parseInt (String))

Вы используете createStatement вместо prepareStatement. createStatement делает поддержку параметров гайки!

Проверьте https://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html

И https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

для деталей надеюсь, что это помогает

Было бы неплохо, если в следующий раз вы предоставите DDL, сообщения об ошибках и т. Д., Тогда анализ будет проще.

Другие вопросы по тегам