首页 文章

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

提问于
浏览
0

我使用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 回答

  • 1

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

    如果对数据库游标打开的数据库表进行写访问,则结果集是特定于数据库且未定义的 . 如果可能,请避免使用此类并行访问 .

相关问题