ABAP中何时使用FIELD-SYMBOLS?两种LOOP内表写法有何区别?
ABAP两种LOOP遍历内表写法的差异
首先我们先明确两种写法的代码实现:
第一种:LOOP INTO工作区写法
DATA gt_mara LIKE TABLE OF mara. DATA gs_mara LIKE LINE OF gt_mara. LOOP AT gt_mara INTO gs_mara. "code ENDLOOP.
第二种:LOOP ASSIGNING字段符号写法
DATA gt_mara LIKE TABLE OF mara. FIELD-SYMBOLS <gs_mara> LIKE LINE OF gt_mara. LOOP AT gt_mara ASSIGNING <gs_mara>. "code ENDLOOP.
核心差异对比
- 运行性能差异
第一种LOOP INTO的本质是每次循环都将内表当前行的全量数据拷贝到工作区变量gs_mara中,当内表数据量越大、行结构字段越多越宽时,数据拷贝的开销就越高,性能损耗越明显。第二种ASSIGNING的逻辑是直接让字段符号<gs_mara>指向内表当前行的内存地址,全程没有数据拷贝动作,不管内表规模多大,性能都远高于INTO工作区的写法,处理十万级以上大表时性能差距可达数倍。 - 数据修改逻辑差异
使用第一种写法时,循环内部修改gs_mara的字段值只会修改工作区的临时副本,不会影响原内表的数据,必须主动执行MODIFY gt_mara FROM gs_mara.才能将修改回写到原内表,漏写MODIFY会导致修改不生效的BUG。使用第二种写法时,字段符号直接指向原内表的行数据,修改<gs_mara>的字段值就是直接修改原内表的对应行,不需要额外写MODIFY语句,代码更简洁,也规避了漏写MODIFY的问题。 - 内存占用差异
第一种写法需要额外声明一个和内表行结构大小一致的工作区变量,会占用对应大小的内存空间,行结构越宽额外内存占用越高。第二种写法的字段符号本质是内存指针,本身只占用极小的内存存储地址信息,不管内表行结构多大,都不会额外占用行数据对应的内存空间。 - 适用场景差异
- LOOP INTO适合仅需要读取内表数据不需要修改、或者需要临时修改副本不影响原内表的场景,部分要求传入工作区参数的场景也需要用该写法。
- LOOP ASSIGNING字段符号适合需要修改内表数据、处理大表需要优化性能的场景,是目前ABAP开发中更推荐的通用遍历写法。
内容的提问来源于stack exchange,提问作者covenant
相关产品推荐
相关产品推荐

