Правильный способ реализации курсора в ABAP с использованием OpenSQL

Я использую оператор SELECT для заполнения внутренней таблицы большим количеством записей. Я новичок в ABAP и OpenSQL. Я знаю, как работают курсоры и зачем они мне нужны в этом случае, но не могу найти хороших примеров, показывающих их правильную реализацию. Это код, с которым я работаю:

TYPES: BEGIN OF lty_it_ids,
         iteration_id TYPE dat_itr_id,
       END OF lty_it_ids.

DATA:  lt_it_ids            TYPE STANDARD TABLE OF lty_it_ids,
       lt_records_to_delete TYPE STANDARD TABLE OF tab_01p.

SELECT 01r~iteration_id    
            INTO TABLE lt_it_ids
            FROM tab_01r AS 01r INNER JOIN tab_01a AS 01a
            ON 01r~iteration_id = 01a~iteration_id
            WHERE 01a~collection_id = i_collection_id.

IF lt_it_ids IS NOT INITIAL. 

  SELECT * FROM tab_01p INTO CORRESPONDING FIELDS OF TABLE lt_records_to_delete
           FOR ALL ENTRIES IN lt_it_ids
           WHERE iteration_id = lt_it_ids-iteration_id AND collection_id = i_collection_id.

  IF lt_records_to_delete IS NOT INITIAL.

    DELETE tab_01p FROM TABLE lt_records_to_delete.      

  ENDIF.
ENDIF.

В первом операторе SELECT я заполняю небольшую внутреннюю таблицу некоторыми значениями, которые соответствуют индексу более крупной таблицы. С помощью этих индексов я могу быстрее искать в большей таблице все записи, которые я хочу УДАЛИТЬ. Это второй оператор SELECT, заполняющий большую внутреннюю таблицу (несколько миллионов строк). Все записи из этой (lt_records_to_delete) внутренней таблицы я хочу удалить из таблицы базы данных.

Как я могу ввести курсор в этот код, чтобы он выбирал и удалял записи меньшими партиями?


person Erik    schedule 27.07.2017    source источник


Ответы (1)


В документации есть хороший пример . Я не совсем уверен, почему вам нужно прочитать записи перед их удалением, но может быть веская причина, о которой вы не упомянули (например, запись значений в журнал). Для процесса, который вы реализуете, обратите внимание на следующее предупреждение в документация:

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

person vwegert    schedule 27.07.2017
comment
Мне нужно сначала выбрать их, потому что в настоящее время, к сожалению, невозможно сделать оператор удаления для всех записей. Этот пример действительно оказался очень полезным. В конечном итоге я делал это не по строкам, как показано здесь, а с размером пакета. - person Erik; 27.07.2017