Привет,
В стандартной большой (в продуктиве - миллионы) таблице есть z-поля.
Надо во всех записях их населить на основании некоторых вычислений.
Делаем SELECT..ENDSELECT с указанием PACKAGE SIZE:
Code:
SELECT ... INTO TABLE it PACKAGE SIZE 1000 WHERE <условие не по z-полям>.
loop at it.
"Вычисляем/заполняем z-поля
endloop.
loop at it.
UPDATE..SET Z1 = ... WHERE ...
endloop.
COMMIT WORK. " То есть COMMIT для очередных 1000 записей
ENDSELECT.
Валимся в дамп
после выполнения первой итерации SELECT..ENDSELECT, т.е. в момент когда
Code:
SELECT ... INTO TABLE it PACKAGE SIZE 1000 WHERE (условие не по z-полям).
выполняется во
второй раз.
Дамп такой:
Code:
Runtime Errors DBIF_RSQL_INVALID_CURSOR
Except. CX_SY_OPEN_SQL_DB
...
Possible causes in the application program:
While a read process from a database cursor is taking place
(within a loop SELECT/LOOP/EXEC SQL or before a FETCH command),
one of the following statements is used:
- MESSAGE (apart from MESSAGE S...)
- COMMIT WORK
- ROLLBACK WORK
- BREAK-POINT
- WAIT
- CALL FUNCTION ... DESTINATION (synchronous RFC)
- CALL FUNCTION ... STARTING NEW TASK
- RECEIVE RESULTS
- CALL DIALOG
- CALL SELECTION-SCREEN
- CALL TRANSACTION
- CALL SCREEN, or any other statement that results in the display of a new screen
Действительно, COMMIT внутри цикла есть.
Вопрос - если я его, к примеру, уберу чтобы избежать дампа - в какой момент система сама его применит?
Случайно не после обработки всех миллионов записей? Если так - видимо можно ожидать что ресурсов на транзакцию такого размера может не хватить? (в системе разработки записей мало, эксперимент не поставишь)
Или может следует организовать обновление иначе? Типа - применить курсор...
На всякий случай - речь об ECC6, MS SQL.
Спасибо заранее