当前位置: 首页 > 工具软件 > BigSQL > 使用案例 >

问题:ABAP:编译错误:The Open SQL command is too big

沈华皓
2023-12-01

编译报错“The Open SQL command is too big”,问题文档翻译:

  • 发生转储DBSQL_STMNT_TOO_LARGE。详细日志可以在事务ST22中找到

这违反了SQL命令的大小限制。
根据使用的数据库系统的不同,出现这种情况的原因可能有以下几种:

  • 语句文本太长
  • 这句话太多了;
  • 语句包含太多条件;
  • 语句包含太多的比较值;

如果ON-、WHERE-或HAVING SQL子句至少有一个IN condition与包含太多条目的内部表(RANGE表、SELECT选项),则通常会发生这样的错误


由于这个错误容易忽视的地方:

1、如果需要通过一个字段查询其他表的相关数据,在第一次过滤这个字段数据的时候尽可能限制
(PS:否则,修改其他的地方,拆了东墙补西墙!!!)

2、SELECT f1…fn FROM… INTO TABLE 和 SELECT f1…fn FROM… INTO CORRESPONDING FIELDS OF TABLE的使用区别

  • INTO TABLE:查询的数据按照 f1…fn字段的顺序填充到内表。
    (容易出错,字段要一一对应。)
  • INTO CORRESPONDING FIELDS OF TABLE:查询的数据按照f1…fn的字段名和内表的字段名一一对应填充到内表。

3、查询符合条件的数据总条数,在不是设置出表条数的前提下,可以使用下面的方式

SELECT
COUNT( DISTINCT a~matnr ) INTO @e_rowcount
FROM mara AS a
LEFT OUTER JOIN zmakt AS b ON a~matnr = b~matnr
WHERE a~liqdt > @sy-datum
AND a~laeda >= @i_laeda
OR a~ersda >= @i_laeda
OR b~crdat >= @i_laeda
OR updat >= @i_laeda.

4、需要使用一个字段来查询其他数据,不使用表连接的情况下,可以使用下面的方式
(尽量避免使用太多内表,数据过大很容易产生影响。)

DATA: lr_rfpnt TYPE RANGE OF stpo-rfpnt, "部位
ls_rfpnt LIKE LINE OF lr_rfpnt.
1、
ls_rfpnt = ‘IEQ’.
lr_rfpnt = CORRESPONDING #( gt_compare[] MAPPING low = rfpnt ).
MODIFY lr_rfpnt FROM ls_rfpnt TRANSPORTING sign option WHERE sign IS INITIAL.
2、
lr_rfpnt [] = VALUE #( sign = ‘I’ option = ‘EQ’
( low = ‘XXXX1’ ) ( low = ‘XXXX2’’ ) ).

select …INTO TABLE @gt_data
FROM mast INNER JOIN stpo ON mast~stlnr = stpo~stlnr
WHERE mast~werks IN @s_werks
AND stpo~rfpnt NOT IN @lr_rfpnt.

5、在使用IN的来筛选条件的时候,记住要判断删选条件是否为空
(不是需要查询所有数据的情况下,数据过多容易DUMP掉)

(1)判断内表是否为空
IF NOT gt_mara[] IS INITIAL.

ENDIF.

(2)判断字段内容为空,根据类型不一样,判断方式需要改变

6、删除多条数据的方式
(1)根据数据排的序号删除多条。
(PS:一条条删除会发现序号也会动态更改)

DELETE 内表名 FROM 1 TO 10.

(2)删除重复数据。

SORT 内表名 BY matnr.
DELETE ADJACENT DUPLICATES FROM 内表名 COMPARING matn

7、学会善用SY-SUBRC

一般来说,结果为 0 则算是执行有符合的算是成功; 为 4 则执行无符合的算是失败。

8、使用SELECT来判断数据的正确性,比捞取到内表要简洁很多!如下面的语句:
SELECT * INTO TABLE @DATA(lt_cawn)
FROM cawn WHERE atwrt = @<lfs_excel>-charg+0(2)…
IF SY-SUBRC = 0.

else.

ENDIF.

9、使用FOR ALL ENTRIES IN时不能使用 OFFSET来进行查询页数限制。
使用示例:
SELECT zqc1~matnr, zqc1~csi, zqc1~en_bk, zqc1~tpg_uc
INTO TABLE @DATA(lt_csi)
FROM zmm005c003 AS zqc1
FOR ALL ENTRIES IN @lt_mm15
WHERE zqc1~matnr = @lt_mm15-matnr
AND zqc1~color_atinn = @lt_mm15-color_atinn
AND zqc1~color = @lt_mm15-color.
SORT lt_csi BY matnr.


避免措施【转载】:

1、Open SQL 优化
————————————
https://www.cnblogs.com/jiangzhengjun/p/4265175.html

2、ABAP TABLE BUFFER
————————————
https://blog.csdn.net/lvzhqi/article/details/4217919

 类似资料: