abap - 具有多个内部表的 ABAP CURSOR FETCH
问题描述
我在下面有一个 CURSOR。
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
解决方案
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>
动态创建一组变量。我的解决方案改为创建一个表,然后可以使用[]
索引访问器方便地对其进行寻址,如lt_itab[ <count> ]
.
该答案侧重于包装方面。您的问题还有另一个方面(db_table)
是动态的,您可能直到运行时才知道实际的表类型。对于这些情况,您可以参考 ABAP 的 Run-Time Type Interfaces (RTTI) 和CREATE DATA
语句来确定和实例化合适的数据类型。
推荐阅读
- laravel - 如何删除 Laravel cookie,使其即使在同一个请求中也消失了
- c# - Entity Framework Core:从相关表中获取数据,包括
- c# - 停靠在 winform selenium 实例而不是 cefsharp
- git - 如何将一个 git 功能分支合并到另一个?
- ios - 当我尝试调试时 XCODE 12 崩溃
- ios - 颤振升级后:'!_debugLocked':不正确。- 未处理的异常:在构建期间调用 setState() 或 markNeedsBuild() - dev
- mongodb - 猫鼬中的 FindOneAndUpdate 子文档数组删除文档而不是更新
- sql - 查询雪花中的半结构化字段
- r - R Formattable -> 导出的 .png 和导出的 html 小部件不匹配
- javascript - 尝试使用 javascript/jquery 使选择器动态化