`
wsql
  • 浏览: 11771744 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Use For all entries in abap sql need attention...

阅读更多

Use For all entries in abap sql need attention

1SELECT CARRID

CONNID

FLDATE

PRICE

FROM SFLIGHT

INTO TABLE GT_tab

FOR ALL ENTRIES IN GT_SFLIGHT

WHERE CARRID = GT_SFLIGHT-CARRID

AND CONNID = GT_SFLIGHT-CONNID.

WHERE 条件中,GT_SFLIGHT-CARRIDGT_SFLIGHT-CONNID这些列将用作占位符。该 SELECT 语句的结果集是 SELECT 语句的所有结果集的联合,这些结果集是用内部表 GT_SFLIGHT 中的相应值在每一行上替换占位符的结果。

2.使用该语句,对于最后得出的结果集系统会自动删除重复行,也就是distinct的问题。因此如果你要保留重复行记录时,记得在SELECT语句中添加足够键值项目,以保证结果集中所需重复项目不会被删除。

3FOR ALL ENTRIES IN后面使用的内表itab如果为空,系统将视为无条件选取,将当前CLIENT下所有记录选出。因此为避免无意义的全件检索,在使用该语句前一定要判断内部表itab是否为空,为空时不执行包含该语句的数据库检索处理。

4.由于itab-f实际上是作为占位符被替换,所以内部表itab中不要包含HEADER行,以免造成混淆,检索出错。

5.内部表itab中作为条件替换用项目的类型和长度,一定要和检索数据库中对应的项目相同,否则编译不能通过。

6.对于内部表itab中作为条件替换用项目,不能使用LIKE,BETWEEN,IN比较操作符。因为这些比较操作符都是不确定比较操作符(将选择条件设定在一个范围内),而FOR ALL ENTRIES IN语句的作用相当于将选择条件块全部并列开来,用OR连接,如果每个OR分支中又是不确定的范围,那么系统性能将大大降低,因此R/3系统在使用该语句时禁止使用不确定比较操作符。

7.使用该语句时,ORDER BY语句和HAVING语句将不能使用。

8.使用该语句时,除COUNT( * )以外的所有合计函数(MAX,MIN,AVG,SUM)都不能使用。

9.使用时,最好先按照选择条件字段排序,这样会改善performance.

10.使用FOR ALLl ENTRIES存在的风险

SELECT语句中使用FOR ALL ENTRIES时,SAP系统在将OPEN SQL转换成NATIVE SQL时将进行如下形式的转换:

SELECT CARRID

CONNID

PRICE

FROM SFLIGHT

INTO TABLE IT_PRICE

FOR ALL ENTRIES IN IT_SFLIGHT

WHERE CARRID = IT_SFLIGHT-CARRID

AND CONNID = IT_SFLIGHT-CONNID'.

To:

SELECT DISTINCT CARRID

CONNID

PRICE

FROM SFLIGHT

INTO TABLE IT_PRICE

WHERE ( CARRID = 'LH' AND

CONNID = '2415' ) OR

( CARRID = 'SQ' AND

CONNID = '0026' ) OR

( CARRID = 'LH' AND

CONNID = '0400' ) .

也就是会将for all entries内表中的记录展开成or语句连接成 condition语句,这样当内表记录非常大时,该select语句亦非常的庞大。当这些选择条件达到一定的数量时就会出现 "DBIF_RSQL_INVALID_RSQL 错误,这是由于后台数据库对于选择条件的数量是有一定的限制的,达到这个限制时就会出现如上运行时错误。不同的后台数据库这个限制数量也是不同的。

IN range table亦同。

解决方案:可以根据错误“DBIF_RSQL_INVALID_RSQL SAP官网查找notes

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics