SAP 数据库操作相关的 SQL 语句:更新篇
UPDATE 语句
UPDATE语句用于更新表中已经存在的数据。 UPDATE 语句一次可以更新一行或多行。
表更新可以通过使用表工作区变量来执行。工作区结构应与表结构完全相同。表更新可以通过三种方式完成,它们是:
- 使用表工作区更新单行
- 使用 where 条件更新
- 使用内表更新多行
使用表工作区更新单行
要使用工作区数据更新数据库表中的单行,请使用以下语法:
UPDATE dbtab FROM wa.
db-table
是 ABAP 字典数据库表的名称,wa
是表工作区。- 工作区
wa
数据覆盖数据库表db-table
中具有相同键的行。工作区wa
结构应与表结构完全相同。数据按照表行结构放置在数据库表中,与工作区结构无关。参考数据库表结构来定义工作区是一个好主意。 - 如果数据库表包含与工作区中指定的键相同的行,则操作成功完成,并将
SY-SUBRC
设置为 0。否则,不插入该行,并将SY-SUBRC
设置为 4。 - 也可以使用
UPDATE dbtab FROM @wa.
使用 WHERE
条件更新
要更新数据库表中的特定列,请使用以下语法:
UPDATE <dbtab> SET column-1=value-1,
column-2= value-2, ..., column-n=value-n
[WHERE <condition>].
WHERE
子句指定满足条件的行。如果我们不指定WHERE
子句,则所有行都会更新。- 表达式
column-1=value-1,column-2=value-2,...,column-n=value-n
是指定列(column-1,column-2,…, column-n) 以及应更新的值 (value-1, value-2, …, value-n)。 - 如果至少更改了一行,则系统将
SY-SUBRC
设置为 0,否则设置为 4。 SY-DBCNT
包含更改的行数。
如果我们使用 SET
语句,我们无法动态指定数据库表。
- 或者使用
@
符号:
UPDATE <dbtab> FROM @( VALUE #( comp1 = ... comp2 = ... ) ). "Using a host expression
使用内表更新多行
要使用内部表的内容更改数据库表中的多行,请使用以下语法:
UPDATE dbtab FROM TABLE internal-table [ACCEPTING DUPLICATE KEYS].
- 其中 dbtab 是目标数据库表的名称,internal-table 是源内部表的名称
- 内部表 internal-table 更改数据库表 dbtab 中具有相同键的行
- 如果系统由于不存在具有指定键的行而无法更改行,则不会终止整个操作,而是继续处理内表的下一行
- 如果内表中的所有行都已被处理,则
SY-SUBRC
设置为 0。否则,设置为 4。如果所有行都没有用于更新,我们可以通过减去已处理的行数来计算未使用的行数SY-DBCNT
中的行数占内部表中的总行数 - 如果内表为空,则
SY-SUBRC
和SY-DBCNT
设置为 0 - 每当我们想要更改数据库表中的多行时,这是比逐行更改更有效的方法。
- 或者使用
@
符号,UPDATE dbtab FROM TABLE @itab.
UPDATE dbtab FROM TABLE @( VALUE #( ( comp1 = ... comp2 = ... )
( comp1 = ... comp2 = ... ) ) ).
数据库表更新的几个原则
在更新数据库数据时,可以一条一条记录的更新,也可批量的更新多条记录。当更新记录数较多时,请采用批量更新的方式,有助于性能的提高。
不建议写法:
LOOP AT it_tab INTO wa_tab.
……
UPDATE dbtab SET field01 = wa_tab-field01 WHERE field2 = wa_tab-field2.
ENDLOOP.
建议写法:
LOOP AT it_tab INTO wa_tab.
……
ENDLOOP.
UPDATE dbtab FROM TABLE it_tab.
执行完成更新语句后,会有两个比较有用的系统变量值返回:
SY-SUBRC
为 0 时则所有记录都成功更新SY-DBCNT
该值为成功更新的记录数
更新数据表的大致格式为:
CALL FUNCTION 'ENQUEUE_….'
SELECT … INTO TABLE internal table
UPDATE … FROM TABLE internal table
COMMIT WORK
CALL FUNCTION 'DEQUEUE_….'
INSERT 语句
Open SQL INSERT 语句用于将数据插入到数据库表中。 INSERT 语句可以在单次执行中插入单行或多行。
向表中插入数据可以使用与表结构完全相同的表工作区变量来执行。
INSERT
语句允许将一行或多行插入到数据库表中。如果行是在一张表上创建的,并且其维护状态定义为“读取”和“更改”,则我们只能将行插入到 ABAP 字典视图中。
我们可以静态或动态地指定数据库表。将数据插入表可以通过两种方式执行,这些是:
- 使用表工作区插入单行
- 使用内表插入多行
使用表工作区插入单行
要将单行插入数据库表中,请使用以下语法:
INSERT db-table FROM work-area.
使用内表插入多行
语法:
INSERT db-table FROM TABLE internal-table [ACCEPTING DUPLICATE KEYS].
- db-table指定目标数据库表的名称,internal-table是源内部表的名称
- 上面的语法在一次操作中把内部表 internal-table 的所有行写入数据库表
- 如果系统能够插入内部表 internal-table 的所有行,
SY-SUBRC
被设置为0。如果一个或多个行不能被插入,因为数据库已经包含有相同键的行,就会发生运行时错误。我们可以通过使用增加的ACCEPTING DUPLICATE KEYS
来防止运行时错误的发生。在这种情况下,会导致运行时错误的行被丢弃,并且SY-SUBRC
被设置为 4 - 系统字段
SY-DBCNT
包含插入到数据库表中的行数,与SY-SUBRC
中的值无关
MODIFY
语句
MODIFY
语句用于修改表中的数据。 MODIFY
语句用作 INSERT
和 UPDATE
语句的组合。
如果数据库表没有包含相同键的行,则插入该行,在这种情况下,MODIFY
的工作方式与 INSERT
类似,该行被添加。如果数据库中已经包含有相同键的行,该行将被更新,MODIFY
在这种情况下像 UPDATE
一样工作,该行被改变。
我们可以静态或动态指定数据库表 db-table。修改数据可以通过两种方式执行,这些方式是:
- 使用表工作区修改单个记录
- 使用内表修改多行
使用表工作区修改单行
要插入或修改数据库表中的单行,请使用以下语法:
MODIFY db-table FROM work-area.
- db-table 是 ABAP 字典数据库表的名称,work-area 是表的工作区
- 工作区 work-area 数据写入数据库表 db-table。工作区 work-area 的类型、长度和对齐方式应与数据库表结构相同。数据按照表结构行放置在数据库表中,与工作区结构无关。参考数据库表结构来定义工作区始终是一个好主意
- 如果数据库表尚未包含与工作区中指定的键相同的行,则会插入新行。如果数据库表确实包含与工作区中指定的键相同的行,则现有行将被覆盖。
SY-SUBRC
始终设置为 0
使用内表修改多行
要在数据库表中插入或更改多行,请使用以下语法:
MODIFY db-table FROM TABLE internal-table.
- db-table 是目标数据库表的名称,internal-table 是源内部表的名称
- 尚未在数据库表中具有相同键的行的内表的行将被插入到表中。内部表中已经是数据库表中具有相同键的行的那些行将覆盖数据库表中的现有行
SY-SUBRC
始终设置为 0SY-DBCNT
设置为内表中的行数。
DELETE
语句
DELETE
语句用于从表中删除行。 DELETE
语句允许从数据库表 db-table 中删除一行或多行。
如果 ABAP 字典视图创建了一张表,并且其维护状态定义为读取和更改,那么我们只能从 ABAP 字典视图中删除行。我们可以静态或动态地指定数据库表 db-table。删除数据可以通过两种方式完成,它们是:
- 使用
WHERE
条件删除行, - 使用表工作区删除单行
- 使用内表删除多行
使用 WHERE
条件删除行
使用删除条件删除行,语法结构:
DELETE FROM db-table WHERE condition.
- 数据库表中满足
WHERE
子句条件的所有行都将被删除。FROM
关键字应该在关键字和数据库表之间进行编码 - 如果至少删除一行,系统将
SY-SUBRC
设置为 0,否则设置为 4 SY-DBCNT
包含删除的行数
使用表工作区删除单个记录
我们可以使用工作区内容选择要删除的行:
DELETE db-table FROM wa.
使用内表删除多行
DELETE dbtab FROM TABLE internal-table.
删除的的方式与 MODIFY 类似,如果内部表的所有行都被处理了,SY-SUBRC
被设置为0。 SY-DBCNT
包含从数据库表中删除的行数。如果不是所有的行都用于删除,我们可以通过从内部表的总行数中减去 SY-DBCNT
中的删除行数来计算未使用的行数。如果内部表是空的,SY-SUBRC
和 SY-DBCNT
被设置为 0。
删除语句的使用原则
一般除了明确的自定义表可以使用删除语句之外,不建议直接使用 DELETE
,一般在开发中,会选择定义一个 ZFLAG
或者 ZDELETE
字段,然后再用户删除的时候,通过 UPDATE
语句将此字段的值设置为 X
,此方式也是 SAP 的官方诸多表格的使用方式。
- 点赞
- 收藏
- 关注作者
评论(0)