Вставить в базу данных
Я использую 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>