带有多个内部表的ABAP CURSOR FETCH

时间:2019-03-18 07:37:02

标签: abap

我在下面有一个游标。

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 个答案:

答案 0 :(得分:2)

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.

请注意,这没有道理。正如Sandra Rossi所指出的,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>变量。我的解决方案而是创建一个表表,然​​后可以使用{{1 }}索引访问器,如[]中一样。

此答案侧重于包装方面。您的问题还有另一个方面,lt_itab[ <count> ]是动态的,您可能直到运行时才知道实际的表类型。对于这些情况,可以参考ABAP的运行时类型接口(RTTI)和(db_table)语句来确定和实例化合适的数据类型。