ABAP DELETE 语句介绍与示例

1,424 阅读5分钟

介绍

在 SAP 中,DELETE 语句不单单能用于数据库中,还可以用于内表的操作。

DELETE 内表

DELETE 语句用于从内表中删除一条或多条记录。可以通过指定表键或条件或查找重复条目来删除内表记录。具有非唯一键的标准表或排序表可以包含重复条目。在删除上述两个表中的重复条目时,删除表中的第一个条目。从下面显示的内部表语法中删除记录或行:

DELETE TABLE <itab> [FROM <work_area>/[INDEX <index-num>]].
  • <itab>: 给定内表
  • <work-area>:给定工作区
  • <index-num>:指定要删除的行/行的索引号。

删除行

DELETE 操作根据工作区提供的关键字或用 INDEX 关键字编码的索引号删除特定的记录或行。对于索引表,可以使用有 INDEX 选项的 DELETE 语句通过索引删除行,语法如下:

DELETE <itab> INDEX idx.

该语句从内表 itab 中删除索引为 idx 的行。删除成功后,下面的所有行的索引都将减去 1,并将 sy-subrc 返回 0,如果不存在索引为 idx 的行,则 sy-subrc 返回 4。

通过关键字删除单行

有两种语法形式根据关键字来来删除单行,分别为:

DELETE TABLE <itab> FROM <wa>.
DELETE TABLE <itab> WITH TABLE KEY <K1> = <F1> ... <Kn> = <Fn>.

通过 WHERE 语句删除满足某种特定条件的行

WHERE 子句的 DELETE 语句删除单行或多行。带 WHERE 子句的 DELETE 语句删除所有满足指定逻辑条件的行。

DELETE <itab> [FROM <n1>] [TO <n2>] [WHERE <condition>].
  • <itab>: 指定内部表
  • FROM <n1>:指定要删除第一行的索引
  • To <n2>:指定要删除的最后一行的索引
  • WHERE <condition> :指定逻辑表达式的第一个操作数必须是 <itab> 的组成部分

该语句使用时必须指定三个选项中的一个。对于索引表,如果没有使用 WHERE 选项,则系统从 <itab> 中删除所有索引在 n1n2 之间的行。如果不指定 FROM 选择,则系统从第一行开始删除,如果不指定 TO 选项,则系统删除所有行直到最后一行。

对于非索引表,不能够使用 FROMTO 选项,只能使用 WHERE 选择,系统从 <itab> 中删除满足条件的行。

内表循环中删除某些行

有些时候,我们循环访问内表的数据,然后通过另外一个内表进行字段匹配找出不符合我们条件的内表行数据,这些数据需要被删除,一开始我们的直观写法可能是下面这种:

LOOP AT itab INTO wa_itab.  
  
  READ TABLE itab2 INTO wa_itab2.  
  IF sy-subrc IS INITIAL.  
  
    DELETE itab FROM wa_itab.  
    MODIFY itab.  
  ENDIF.  
  
ENDLOOP.

更合理的方式应该是不要在循环语句中使用 DELETE 语句,而是在满足条件时设置一个标志 flag 。如果在循环中使用 DELETE 语句,每次执行该语句时都必须重新生成索引,如果内部表中的记录较多,这将影响性能。因此,应在循环外使用 DELETE 语句删除所有标志已设置的记录。

LOOP AT itab INTO wa_itab.  
  w_tabx = sy-tabix.  
  READ TABLE itab2 INTO wa_itab2 WITH KEY field = wa_itab-field.  
  IF sy-subrc = 0.  
    wa_itab-flag = 'X'.  
    MODIFY itab INDEX w_tabx FROM wa_itab TRANSPORTING flag.  
  ENDIF.  
  CLEAR w_tabx.  
ENDLOOP.  
  
DELETE itab WHERE flag = 'X'.

删除内表重复项

SORT <itab> BY <field> [ascending/descending].  
  
DELETE ADJACENT DUPLICATES FROM <itab> COMPARING ALL FIELDS.

DELETE 数据库 dbtab

数据条目的删除操作通过 OPEN SQL 中的 DELETE 语句进行

删除单行操作

DELETE FROM dbtab WHERE <fix_key>.

WHERE 子句中,必须指明全部表关键字段的值。

或者使用

DELETE dbtab FROM wa.

该语句从数据库表 dbtab 中删除关键字与工作区 wa 中指定的主关键字相同的行,工作区的长度至少要等于数据库表的主关键字的长度。如果没有哪一行的主关键字与工作区中相应字段匹配,则操作失败。

WHERE 条件删除多行数据

删除多行数据可以通过 WHERE 子句进行:

DELETE FROM dbtab WHERE <conditions>.

该语句将从数据库表中删除所有符合条件的条目,需要注意的是检查内表不要使之为空,因为该操作无意义,不会删除任何数据条目。

例如:

TABLES SBOOK. 

DELETE FROM SBOOK WHERE CARRID = 'LH' AND CONNID = '0400' AND FLDATE = '19950228'.

在该操作后,sy-dbcnt 中将返回删除的行的数目。

像内表的操作一样,如果至少删除了一行,sy-subrc 返回 0 ,如果没有删除的行,则会返回 4.

通过内表删除数据库多行

DELETE dbtab [CLIENT SPECIFIED] FROM TABLE itab.

这个语法从数据库表中删除主关键字段值与内表中的某行相同的数据条目。其中内表行的长度至少与数据库表中的主关键字长度相同。

如果数据库表中没有任何一行的主关键字段与指定内表行中的数据库值相同,则系统不删除多行,则系统不会中止整个操作,而是继续处理内表的下一行。

删除所有数据

如果希望删除所有行,可以通过下面语法实现:

DELETE FROM dbtab.

或者通过内表删除多行数据条目的过程中将内表置为空,或者使用 WHERE field LIKE '%' 作为 WHERE 子句中的唯一条件。

总结

本文介绍了 SAP ABAP 中的 DELETE 语句,它不仅可以用于对内表的数据删除操作,还可以用于对数据库的数据删除操作。

两种在对数据删除操作成功时,sy-subrc 的值都为 0,失败为 4。

DELETE FROM dbtab 语句与 DELETE FROM itab 语句具有相同的语法。如果内部表与数据库表同名,则像这样的语句访问的将是内表