SAP 数据库操作相关的 SQL 语句:更新篇

举报
雨绸缪 发表于 2023/07/31 17:06:35 2023/07/31
【摘要】 UPDATE 语句UPDATE语句用于更新表中已经存在的数据。 UPDATE 语句一次可以更新一行或多行。表更新可以通过使用表工作区变量来执行。工作区结构应与表结构完全相同。表更新可以通过三种方式完成,它们是:使用表工作区更新单行使用 where 条件更新使用内表更新多行 使用表工作区更新单行要使用工作区数据更新数据库表中的单行,请使用以下语法:UPDATE dbtab FROM wa.d...

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-SUBRCSY-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_….'

SELECTINTO TABLE internal table

UPDATEFROM 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 语句用作 INSERTUPDATE 语句的组合。

如果数据库表没有包含相同键的行,则插入该行,在这种情况下,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 始终设置为 0
  • SY-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-SUBRCSY-DBCNT 被设置为 0。

删除语句的使用原则

一般除了明确的自定义表可以使用删除语句之外,不建议直接使用 DELETE,一般在开发中,会选择定义一个 ZFLAG 或者 ZDELETE 字段,然后再用户删除的时候,通过 UPDATE 语句将此字段的值设置为 X,此方式也是 SAP 的官方诸多表格的使用方式。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。