Текущее время: Вс, июл 27 2025, 19:58

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Update внутри SELECT..ENDSELECT
СообщениеДобавлено: Чт, мар 17 2011, 20:28 
Ассистент
Ассистент

Зарегистрирован:
Чт, окт 05 2006, 16:13
Сообщения: 36
Привет,

В стандартной большой (в продуктиве - миллионы) таблице есть 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.

Спасибо заранее


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Update внутри SELECT..ENDSELECT
СообщениеДобавлено: Пт, мар 18 2011, 09:45 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Для обновления полей больших таблиц я применял следующий алгоритм:
1.Выбирал ключи записей, которые нужно изменить
2.В цикле для каждой записи отдельно выбирал все данные из таблицы для обновления, заполнял Z-поля и добавлял во 2-ю внутреннюю таблицу, через каждые n-ого записей (1000) выполнял UPDATE из 2-й внутренней таблицы.
3.Очищал 2-ю внутреннюю таблицу и делал COMMIT
После цикла апдейтил оставшиеся записи.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Update внутри SELECT..ENDSELECT
СообщениеДобавлено: Пт, мар 18 2011, 09:54 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, янв 25 2005, 19:26
Сообщения: 67
Пол: Мужской
Boozila написал(а):
Или может следует организовать обновление иначе? Типа - применить курсор...


Можно через OPEN CURSOR WITH HOLD:
http://help.sap.com/abapdocu_70/en/ABAPOPEN_CURSOR.htm

Только коммит после обработки очередной порции записей нужно будет делать не через оператор COMMIT WORK, а через ФМ 'DB_COMMIT', тогда курсор не закроется.

_________________
Come to Cookies! We Have Dark Sides!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Update внутри SELECT..ENDSELECT
СообщениеДобавлено: Сб, мар 19 2011, 00:33 
Ассистент
Ассистент

Зарегистрирован:
Чт, окт 05 2006, 16:13
Сообщения: 36
Вот спасибо.
Оба подхода выглядят убедительно.
Думаю - начну со 2-го, т.к. переделывать ничего не надо.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB