Текущее время: Пн, июл 28 2025, 01:44

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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