2015-04-22 5 views
1

Я новичок в MyBatis. Я пытаюсь сделать пакетную вставку в одну таблицу ORACLE db. Это код в файле XML картографа,Динамический sql для пакетной обработки

<insert id="insertAuditLogAsBatch" > 
    insert into AUDIT_LOG (ID,ENTITY_ID,PERIOD_ID) 
    select SEQ_AUDIT_LOG.nextval, entityId, periodId 
    from 
    <foreach collection="auditLogs" item="auditLog"> 
     (SELECT 1 as entityId, 1 as periodId FROM DUAL UNION ALL) 
    </foreach> 
    SELECT * FROM dual 
</insert> 

Это пример кода, и я пытаюсь упорствовать жестко закодированные значения.

выше программа бросает ошибку ниже от Oracle,

; плохая грамматика SQL []; вложенное исключение java.sql.BatchUpdateException: ORA-00928: отсутствует ключевое слово ВЫБРАТЬ

Сформированный партия SQL из моего кода есть «UNION ALL» в конце перед закрытием скобки, «)». Мне нужно следующее: за последние выберите заявление Мне не нужен «UNION ALL» в конце. Мой вопрос,

  1. Могу ли я проверить некоторые условия внутри Еогеасп так, что последний выбрать не будет иметь «UNION ALL». вместо этого мы должны иметь скобку «)», чтобы указать конец операторов SELECT.
  2. Вставляется ли эта вставка строк? Я пытаюсь протестировать пакетную операцию, используя MyBatis здесь.

ответ

0

Полная версия, основанная на вашем входе:

<insert id="insertAuditLogAsBatch" > 
    insert into AUDIT_LOG (ID,ENTITY_ID,PERIOD_ID) 
    select SEQ_AUDIT_LOG.nextval, entityId, periodId 
    from 
    (
    <foreach collection="auditLogs" item="auditLog" open="(" separator=" UNION ALL " close=")"> 
    SELECT 1 as entityId, 1 as periodId FROM DUAL 
    </foreach> 
    ) 
</insert> 

попробовать что-то вроде:

<foreach collection="auditLogs" item="auditLog" open="(" separator=" UNION ALL " close=")"> > 
    SELECT 1 as entityId, 1 as periodId FROM DUAL 
</foreach> 
+0

Я попытался с помощью этого <Еогеасп коллекция = пункт «auditLogs» = «Auditlog» открыт = «(» Разделитель = «UNION ALL„близко =“)»> Но теперь я получаю другую ошибку: плохо SQL-грамматика []; Вложенное исключение - это java.sql.BatchUpdateException: ORA-00933: команда SQL не была закончена. Также мы можем убедиться, что это пакетная вставка в базу данных? – user184794

0

ли дозируется это строки вставки? Я пытаюсь протестировать операцию , используя MyBatis здесь.

Нет. Это не так, как работает партия в Мибатисе. Для пакетной вставки вы должны

1) Упоминания, что вы хотите, сеанс для пакетной обработки

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); 

2) Repetedly называют простую вставку (без какого-либо Еогеаспа) для каждой записи, которую вы хотите вставить

for (Foo foo: fooList) 
     fooDao.persistFoo(foo); 

3) Промыть сеанс после каждого N записывает

session.flushStatements(); 

4) Comm это после того, как все записи вставлены.

session.commit(); 
Смежные вопросы