Как сделать массовый отбор SAP ABAP - PullRequest
0 голосов
/ 11 декабря 2018

Я делаю массивный выбор из базы данных с целью сохранения его на сервере приложений или в локальном каталоге.Поскольку в БД есть множество записей, я сначала попробовал этот способ:

SELECT * FROM db PACKAGE SIZE iv_package
    INTO CORRESPONDING FIELDS OF TABLE rt_data
    WHERE cond  IN so_cond
    AND   cond1 IN so_cond1.

SAVE(rt_data). 
ENDSELECT. 

Это привело к дампу со следующим сообщением:

Ошибки времени выполнения: DBIF_RSQL_INVALID_CURSOR
Исключение: CX_SY_OPEN_SQL_DB

Я также попытался сделать альтернативный путь:

 OPEN CURSOR WITH HOLD s_cursor FOR
  SELECT * FROM db
    WHERE cond  IN so_cond
    AND   cond1 IN so_cond1.
  DO.
    FETCH NEXT CURSOR s_cursor INTO TABLE rt_data PACKAGE SIZE iv_package.

    SAVE(rt_data).
ENDDO.

Это также привело к дампу с тем же сообщением.

Что лучшеподход к этому сценарию?

1 Ответ

0 голосов
/ 11 декабря 2018
TYPES:
  BEGIN OF key_package_type,
    from TYPE primary_key_type,
    to   TYPE primary_key_type,
  END OF key_package_type.
TYPES key_packages_type TYPE STANDARD TABLE OF key_package WITH EMPTY KEY.
DATA key_packages TYPE key_packages_type.

* select only the primary keys, in packages
SELECT primary_key_column FROM db
    INTO TABLE @DATA(key_package) PACKAGE SIZE package_size
    WHERE cond IN @condition AND cond1 IN other_condition
    ORDER BY primary_key_column.

  INSERT VALUE #( from = key_package[ 1 ]-primary_key_column
                  to   = key_package[ lines( key_package ) ]-primary_key_column )
    INTO TABLE key_packages.

ENDSELECT.

* select the actual data by the primary key packages
LOOP AT key_packages INTO key_package.
  SELECT * FROM db INTO TABLE @DATA(result_package)
    WHERE primary_key_column >= key_package-from
      AND primary_key_column <= key_package-to.
  save_to_file( result_package ).
ENDLOOP. 

Если ваша таблица имеет составной первичный ключ, то есть несколько столбцов, таких как {MANDT, GJAHR, BELNR}, просто замените типы полей from и to структурами и настройте список столбцов впервый SELECT и условие WHERE во втором SELECT соответственно.

...