2016-04-03 1 views
0

Я использую JDBC для создания временной таблицы, добавлять записи в него (с подготовленной инструкцией и пакетной), а затем передать все в другую таблицу:в DB2 с подготовленными заявлениями и партией

 String createTemporaryTable = "declare global temporary table temp_table (RECORD smallint,RANDOM_INTEGER integer,RANDOM_FLOAT float,RANDOM_STRING varchar(600)) ON COMMIT PRESERVE ROWS in TEMP"; 

     statement.execute(createTemporaryTable); 

     String sql = "INSERT INTO session.temp_table (RECORD,RANDOM_INTEGER,RANDOM_FLOAT,RANDOM_STRING) VALUES (?,?,?,?)"; 
     PreparedStatement preparedStatement = connection.prepareStatement(sql); 

     float f = 0.7401298f; 
     Integer integer = 123456789; 
     String string = "This is a string that will be inserted into the table over and over again."; 

     // add however many random records you want to the temporary table 
     int numberOfRecordsToInsert = 35000; 

     for (int i = 0; i < numberOfRecordsToInsert; i++) { 

      preparedStatement.setInt(1, i); 
      preparedStatement.setInt(2, integer); 
      preparedStatement.setFloat(3, (float) f); 
      preparedStatement.setString(4, string); 
      preparedStatement.addBatch(); 

     } 

     preparedStatement.executeBatch(); 

     // transfer everything from the temporary table just created to the main table 
     String transferFromTempTableToMain = "insert into main_table select * from session.temp_table"; 
     statement.execute(transferFromTempTableToMain); 

В этом примере это работает до 30000 записей. Однако, если бы я вставить сказать 35000 записей я получаю следующее сообщение об ошибке:

Invalid data conversion: Requested conversion would result in a loss of precision of 32768. ERRORCODE=-4461, SQLSTATE=42815

ответ

1

Проблема заключается в том, что поле RECORD является smallint. A smallint представляет собой подписанное 16-битное целое число с диапазоном от -32768 до 32767.

Так что вставка значения int 32768 не допускается, так как она не подходит. Вам нужно объявить запись как INTEGER.