ABAP CURSOR FETCH с несколькими внутренними таблицами - PullRequest
0 голосов
/ 18 марта 2019

У меня есть КУРСОР ниже.

OPEN CURSOR WITH HOLD s_cursor FOR
  SELECT * FROM (QUERY_TABLE)   WHERE (OPTIONS).

DO.

    FETCH NEXT CURSOR s_cursor APPENDING TABLE <lt_itab>  PACKAGE SIZE 100000.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.
ENDDO.

Поскольку у меня в таблице огромные данные, мне нужно разбить данные на несколько внутренних таблиц.Что здесь нужно, так это передавать разные внутренние таблицы для каждого FECTH.

Также мне нужно создать несколько внутренних таблиц с одинаковой структурой.Наименование внутренней таблицы будет выглядеть ниже CONCATENATE 'Lt_ITAB' count INTO intname.Я должен быть в состоянии создать внутреннюю таблицу из переменной intname.

Пожалуйста, предоставьте образец или логику.

Заранее спасибо S Sukumar

1 Ответ

2 голосов
/ 18 марта 2019
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, чтобы определить и создать подходящие типы данных.

...