Вставить в базу данных

Я использую mybatis для вставки значений, используя:

Dao.xml

<insert id="someId" parameterType="someBean" >
    INSERT ALL
     <foreach collection="list" item="item" index="index" >
    INTO table_name
               (ID,NAME)        
    VALUES
    (#{item.id},#{item.name})
   </foreach>   
   SELECT * FROM DUAL
</insert>

Dao.java

void someId(List<SomeBean> list);

Переданный размер списка: 350

Но при выполнении его выдает ошибку:

org.springframework.jdbc.UncategorizedSQLException: 
 Error updating database.  Cause: java.sql.SQLException: ORA-24335: cannot support more than 1000 columns

База данных, используемая здесь, является оракулом.

2 ответа

Решение

Я спросил: "У вашей целевой таблицы действительно только две колонки?" и ты сказал:

Имеет 20 столбцов

Я думаю, что это корень ошибки.

На оператор INSERT ALL распространяется ограничение Oracle, согласно которому оператор SQL может содержать только 1000 столбцов. У каждой строки INTO есть проекция, и сумма всех этих столбцов не может превышать 1000.

Теперь ваша команда ibatis сгенерирует одну строку INTO для каждой записи в списке. 750 записей * 20 столбцов легко преодолевают предел в 1000 столбцов. Отсюда и ошибка.

Как это исправить?

В Oracle мы можем использовать функцию TABLE(), чтобы превратить вложенную таблицу (список) в источник данных, например так:

insert into table_name
select * from table (some_list) ;

Обычно я ожидаю, что такой вызов будет заключен в хранимую процедуру. Но в любом случае, список должен соответствовать типу SQL (объекту), ранее определенному в базе данных.

Так что вы, вероятно, не хотите идти по этому пути, потому что, я полагаю, вы используете Ibatis специально, чтобы избежать споров с объектами базы данных. Но если вы решите пойти по этому пути, этот урок может оказаться полезным.

В противном случае, боюсь, вам нужно ограничить количество записей в вашем списке до пятидесяти. Вы можете подумать, что это немного болезненно, но на самом деле ibatis - это не тот инструмент, который нужен для массовой загрузки.

Вы используете Multi Table Insert, которая не предназначена для вставки записи в одну таблицу. Вместо этого используйте следующее.

<insert id="someId" parameterType="someBean" >
    INSERT INTO table_name  (ID,NAME) VALUES
     <foreach collection="list" item="item" index="index" o >              
        ( #{item.id},#{item.name})
     </foreach>   
</insert>
Другие вопросы по тегам