「SAP ABAP」你真的了解OPEN SQL的DML语句吗 (附超详细案例讲解)

Posted ThundersArk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「SAP ABAP」你真的了解OPEN SQL的DML语句吗 (附超详细案例讲解)相关的知识,希望对你有一定的参考价值。

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。


💅文章概要: 各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中DML语句的介绍,希望大家喜欢!


🤟每日一言: 永远年轻,永远热泪盈眶!

目录


前言

  各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中DML语句的介绍,限于篇幅原因,本节内容只涉及到INSERT语句和UPDATE语句,剩余两个语句将在下一小节进行讲解,希望大家喜欢!


DML语句分类

  DML语句(data manipulation language)又称数据操控语言,在传统关系数据库中数据操控语言只有三种,分别是INSERT,UPDATE,DELETE语句,而在SAP ABAP OPEN SQL中DML语句还额外多了一个MODIFY语句,该语句融合了INSERT和UPDATE语句的特点,如果数据库中不存在该条数据会进行INSERT操作,如果存在该条数据会进行UPDATE操作。

  ABAP四种DML语句的基本介绍如下表所示:

语句功能
INSERT插入语句
UPDATE更新语句
DELETE删除语句
MODIFY插入&更新语句

INSERT语句介绍

  ABAP INSERT语句用于向数据库表中插入新的行。

PS:在ABAP中,如果向一个已经存在一条数据的数据库表中再次使用INSERT语句插入相同的数据,通常会导致运行时错误。这是因为数据库表的主键要求每行数据具有唯一性,而重复的数据会违反该要求(主键唯一性约束)。

 插入单条数据


  以下是插入单条数据的一般语法样式:

INSERT INTO <table_name> VALUES <wa>.
INSERT <table_name> FROM <wa>.
INSERT <table_name> FROM TABLE <itab>.

参数介绍:

  • <table_name>是要更新的数据库表的名称。
  • <wa>:存放待插入数据的结构体变量(工作区)。
  • <itab>:存放待插入数据的内表。

  使用结构体变量插入数据

  下面给出一段以SFLIGHT数据库表为基准的示例代码,对ABAP OPEN SQL中通过结构体变量INSERT插入单条数据进行详细的讲解,仅供参考:

DATA:gs_sflight TYPE sflight.
gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
INSERT INTO sflight VALUES gs_sflight.


  这段代码中首先参照数据库表sflight定义了一个结构体变量,并且对结构体中的carridconnid字段赋值,最后使用INSERT语句将该结构体变量的值插入到数据库表中。

PS:插入单条数据一般通过结构体变量赋值来插入,也可以使用只有一行数据的内表来插入。

  使用内表插入数据

  下面给出一段以SFLIGHT数据库表为基准的示例代码,对ABAP OPEN SQL中通过内表INSERT插入单条数据进行详细的讲解,仅供参考:

DATA:gs_sflight TYPE sflight.
DATA:gt_sflight TYPE TABLE OF sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '20020217'.
APPEND gs_sflight TO gt_sflight.
INSERT sflight FROM TABLE gt_sflight.

  这段代码中首先参照数据库表sflight定义了一个结构体变量和内表变量,并且对结构体中的carridconnid以及fldate字段赋值,然后将结构体变量的值插入到内表中。最后使用INSERT语句将该内表中的数据插入到数据库表中。

 插入多条数据


  以下是插入多条数据的一般语法样式:

INSERT <table_name> FROM TABLE <itab> [ACCEPTING DUPLICATE KEYS] .

参数介绍:

  • <table_name>是要更新的数据库表的名称。
  • <itab>:存放待插入数据的内表。

  下面给出一段以SFLIGHT数据库表为基准的示例代码,对ABAP OPEN SQL中通过内表INSERT插入多条数据进行详细的讲解,仅供参考:

DATA:gs_sflight TYPE sflight.
DATA:gt_sflight TYPE TABLE OF sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '20020217'.
APPEND gs_sflight TO gt_sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '20020218'.
APPEND gs_sflight TO gt_sflight.

INSERT sflight FROM TABLE gt_sflight.


  这段代码中首先参照数据库表sflight定义了一个结构体变量和内表变量,并且对结构体中的carridconnid以及fldate字段赋值,然后将结构体变量的值插入到内表中,并且向内表中插入了两条数据。最后使用INSERT语句将该内表中的数据插入到数据库表中。

PS:插入相同主键的数据时会发生dump error,为了避免发生这种错误要使用ACCEPTING DUPLICATE KEYS语句

  下面是两个详细案例,分别展现了当内表中存在相同主键数据时,使用ACCEPTING DUPLICATE KEYS语句和不使用的区别:

  不使用ACCEPTING DUPLICATE KEYS语句

DATA:gs_sflight TYPE sflight.
DATA:gt_sflight TYPE TABLE OF sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '20020219'.
APPEND gs_sflight TO gt_sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '20020219'.
APPEND gs_sflight TO gt_sflight.

INSERT sflight FROM TABLE gt_sflight.

PS:当内表中存在相同主键数据时,不使用ACCEPTING DUPLICATE KEYS语句会造成ABAP编程错误。

  使用ACCEPTING DUPLICATE KEYS语句

DATA:gs_sflight TYPE sflight.
DATA:gt_sflight TYPE TABLE OF sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '20020219'.
APPEND gs_sflight TO gt_sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '20020219'.
APPEND gs_sflight TO gt_sflight.

INSERT sflight FROM TABLE gt_sflight ACCEPTING DUPLICATE KEYS.

PS:当内表中存在相同主键数据时,使用ACCEPTING DUPLICATE KEYS语句不会造成ABAP编程错误,两条相同的数据会被视作一条并且能够被正常插入到数据库表中。


UPDATE语句介绍

  UPDATE语句用于更新数据库表中的数据。

 修改单条数据


  以下是修改单条数据的一般语法样式:

UPDATE <table_name> FROM <wa> .
UPDATE <table_name> FROM TABLE <itab>.
UPDATE <table_name> SET <set> WHERE <cond>.

参数介绍:

  • <table_name>:目标表的名称。
  • <wa>:存放待更新数据的结构体变量(工作区)。
  • <itab>:存放待更新数据的内表。
  • <set> :更新后字段的具体数值。
  • <cond> :WHERE字句的限定条件。

  使用结构体变量修改数据

  下面给出一段以SFLIGHT数据库表为基准的示例代码,对ABAP OPEN SQL中通过结构体变量UPDATE更新单条数据进行详细的讲解,仅供参考:

DATA:gs_sflight TYPE sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '00000000'.
gs_sflight-price = 1600.

UPDATE sflight FROM gs_sflight.


  这段代码中首先参照数据库表sflight定义了一个结构体变量,并且对结构体中的carridconnidfldate以及price字段赋值。最后使用INSERT语句将该结构体变量中的数据更新回数据库表中。

  使用内表修改数据

  下面给出一段以SFLIGHT数据库表为基准的示例代码,对ABAP OPEN SQL中通过内表UPDATE更新单条数据进行详细的讲解,仅供参考:

DATA:gs_sflight TYPE sflight,
     gt_sflight TYPE TABLE OF sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '00000000'.
gs_sflight-price = 1600.
APPEND gs_sflight TO gt_sflight.

UPDATE sflight FROM TABLE gt_sflight.


  这段代码中首先参照数据库表sflight定义了一个结构体变量和内表变量,并且对结构体中的carrid,connid,price以及fldate字段赋值,然后将结构体变量的值插入到内表中。最后使用UPDATE语句将该内表中的数据更新回数据库表中。

  使用SET修改指定数据

  下面给出一段以SFLIGHT数据库表为基准的示例代码,对ABAP OPEN SQL中通过SET更新单条指定数据进行详细的讲解,仅供参考:

UPDATE SFLIGHT SET PRICE = 1600 CURRENCY = 'CNY' 
WHERE CARRID = 'AC'AND CONNID = 0820 AND FLDATE = '20020217'.


 修改多条数据


  以下是修改多条数据的一般语法样式:

UPDATE <table_name> FROM TABLE <itab>.
UPDATE <table_name> SET <set1> <set2> WHERE <cond>.

参数介绍:

  • <table_name>:目标表的名称。
  • <itab>:存放待更新数据的内表。
  • <set1><set2> 等是更新后字段的具体数值。
  • <cond> :WHERE字句的限定条件。

  使用内表修改多条数据

  下面给出一段以SFLIGHT数据库表为基准的示例代码,对ABAP OPEN SQL中通过内表UPDATE更新多条数据进行详细的讲解,仅供参考:

DATA:gs_sflight TYPE sflight.
DATA:gt_sflight TYPE TABLE OF sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '00000000'.
gs_sflight-price = 2000.
APPEND gs_sflight TO gt_sflight.

gs_sflight-carrid = 'AC'.
gs_sflight-connid = 0820.
gs_sflight-fldate = '20020217'.
gs_sflight-price = 2100.
APPEND gs_sflight TO gt_sflight.

UPDATE sflight FROM TABLE gt_sflight.

  这段代码中首先参照数据库表sflight定义了一个结构体变量和内表变量,并且对结构体中的carrid,connid,price以及fldate字段赋值,然后将结构体变量的值插入到内表中,并且内表中存在两条数据。最后使用UPDATE语句将该内表中的两条数据更新回数据库表中。

  使用SET修改指定多条数据

UPDATE SFLIGHT SET PRICE = 1600 CURRENCY = 'CNY' 
WHERE CARRID = 'AC'AND CONNID = 0820 AND FLDATE = '00000000'.


写在最后的话

  本文花费大量时间介绍了OPEN SQL中的INSERT语句和UPDATE语句的详细语法,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!

原创不易,还希望各位大佬支持一下 \\textcolorblue原创不易,还希望各位大佬支持一下 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \\textcolor9c81c1点赞,你的认可是我创作的动力! 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \\textcolored7976收藏,你的青睐是我努力的方向! 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \\textcolor98c091评论,你的意见是我进步的财富! 评论,你的意见是我进步的财富!

以上是关于「SAP ABAP」你真的了解OPEN SQL的DML语句吗 (附超详细案例讲解)的主要内容,如果未能解决你的问题,请参考以下文章

第二篇SAP ABAP7.50新语法之OPEN SQL

「SAP ABAP」OPEN SQLSELECT语句

「SAP ABAP」OPEN SQLWHERE语句大全

一个小技巧,让您的ABAP OPEN SQL具有自描述效果

「SAP ABAP」OPEN SQLGROUP BY | HAVING | ORDER BY

SAP ABAP 表控件