DATA tables TYPE STANDARD TABLE OF table_type WITH EMPTY KEY.
OPEN CURSOR WITH HOLD cursor FOR
SELECT *
FROM (db_table)
WHERE (conditions).
WHILE sy-subrc = 0.
INSERT NEW LINE INTO TABLE tables ASSIGNING FIELD-SYMBOL(<target_table>).
FETCH NEXT CURSOR cursor APPENDING TABLE <target_table> PACKAGE SIZE 100000.
ENDWHILE.
Обратите внимание, что это не имеет смысла. Как отмечает Сандра Росси, идея FETCH CURSOR
состоит в том, что база данных хранит гораздо больше данных, чем может вместить основная память ABAP.Вы все равно хотите извлечь все эти данные в основную память - если ваш набор данных действительно огромен, вам все равно не хватит памяти.
Если, с другой стороны, ваш набор данных достаточно мал, чтобы уместитьсяв основную память ABAP, вы должны вместо этого загрузить ее за один раз и затем применить подходящую упаковку, как в
SELECT * FROM (db_table) INTO TABLE (all_data) WHERE (conditions).
DATA(tables) = split_data_in_packages( data = all_data package_size = 100000 ).
Также обратите внимание, что нет способа создать набор lt_itab<count>
переменныхдинамически. Мое решение вместо этого создает таблицу таблиц, к которой затем можно обращаться с помощью индексатора доступа []
, как в lt_itab[ <count> ]
.
Этот ответ фокусируется на аспекте упаковки.В вашем вопросе есть еще один аспект: (db_table)
является динамическим, и вы, вероятно, не знаете фактический тип таблицы до времени выполнения.В этих случаях вы можете обратиться к ABAP-интерфейсам типов времени выполнения (RTTI) и оператору CREATE DATA
, чтобы определить и создать подходящие типы данных.