【转】ABAP的坑2

来源:互联网 发布:淘宝开店试题答案 编辑:程序博客网 时间:2024/06/16 02:31

如果说工作区域、变量未清空是ABAP第一坑的话,那么FOR ALL ENTRIES的坑大概能算得上第二大坑了。


FOR ALL ENTRIES有三个需要注意的地方。


1、使用前必须判断内表是否为空

如果内表为空,就会使WHERE条件失效,相当于没有指定任何限制。注意是整个WHERE失效,而不是仅仅FOR ALL ENTRIES的字段。

如下面例子:


会取出MAKT所有的数据,而不仅仅是MAKTX等于半成品的。

下面是ST05跟踪的结果:



2、默认的DISTINCT

FOR ALL ENTRIES是把一个SQL分解成多个SQL去执行,然后把结果汇总去重后返回。这个去重的动作其实就是做一个DISTINCT。


把程序改一下,使得IT_MAT有值:


然后运行跟踪一下SQL:



可以看出FOR ALL ENTRIES就是把内表的数据依次放到SQL里面,因为IT_MAT可能有重复的值,所以在最终返回的时候要去重,也就是有个DISTINCT的动作,所以,

第一:最好把内表IT_MAT去重后再使用,提高效率

第二:SELECT后面的要有唯一键值的区别度,防止DISTINCT导致数据丢失。


3、内表大的时候占用内存会很大

如果IT_MAT很大的话,比如几百万数据,执行这个SQL占用的内存是可观的,有时候会达到内存使用的上限,而且效率很差,所以尽量避免大数据量下使用FOR ALL ENTRIES。

原创粉丝点击