使用OpenSQL在ABAP中实现游标的正确方法

时间:2017-07-27 10:07:32

标签: sap 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)内部表的所有记录。

我可以用什么方式将光标引入此代码,以便选择和删除较小批量的记录?

1 个答案:

答案 0 :(得分:1)

有一个good example in the documentation。我不完全确定为什么你需要在删除之前阅读这些条目,但可能有一个很好的理由你忽略了(例如记录值)。对于您正在实施的流程,请注意documentation中的以下警告:

  

如果对数据库的数据库表进行写访问   游标已打开,结果集是特定于数据库且未定义的。   如果可能,请避免这种并行访问。