前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「SAP ABAP」你真的了解OPEN SQL的DML语句吗 (附超详细案例讲解)

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

作者头像
THUNDER王
发布2023-03-19 14:12:41
5940
发布2023-03-19 14:12:41
举报
文章被收录于专栏:THUNDER王——CSDN内容同步
目录

前言

  各位小伙伴们大家好呀!今天继续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语句插入相同的数据,通常会导致运行时错误。这是因为数据库表的主键要求每行数据具有唯一性,而重复的数据会违反该要求(主键唯一性约束)。

 插入单条数据

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

代码语言:javascript
复制
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插入单条数据进行详细的讲解,仅供参考:

代码语言:javascript
复制
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插入单条数据进行详细的讲解,仅供参考:

代码语言:javascript
复制
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语句将该内表中的数据插入到数据库表中。

 插入多条数据

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

代码语言:javascript
复制
INSERT <table_name> FROM TABLE <itab> [ACCEPTING DUPLICATE KEYS] .

参数介绍:

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

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

代码语言:javascript
复制
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语句

代码语言:javascript
复制
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语句

代码语言:javascript
复制
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语句用于更新数据库表中的数据。

 修改单条数据

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

代码语言:javascript
复制
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更新单条数据进行详细的讲解,仅供参考:

代码语言:javascript
复制
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更新单条数据进行详细的讲解,仅供参考:

代码语言:javascript
复制
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更新单条指定数据进行详细的讲解,仅供参考:

代码语言:javascript
复制
UPDATE SFLIGHT SET PRICE = 1600 CURRENCY = 'CNY' 
WHERE CARRID = 'AC'AND CONNID = 0820 AND FLDATE = '20020217'.

 修改多条数据

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

代码语言:javascript
复制
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更新多条数据进行详细的讲解,仅供参考:

代码语言:javascript
复制
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修改指定多条数据

代码语言:javascript
复制
UPDATE SFLIGHT SET PRICE = 1600 CURRENCY = 'CNY' 
WHERE CARRID = 'AC'AND CONNID = 0820 AND FLDATE = '00000000'.

写在最后的话

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • DML语句分类
  • INSERT语句介绍
    •  插入单条数据
      •   使用结构体变量插入数据
      •   使用内表插入数据
    •  插入多条数据
      •   不使用ACCEPTING DUPLICATE KEYS语句
      •   使用ACCEPTING DUPLICATE KEYS语句
  • UPDATE语句介绍
    •  修改单条数据
      •   使用结构体变量修改数据
      •   使用内表修改数据
      •   使用SET修改指定数据
    •  修改多条数据
      •   使用内表修改多条数据
      •   使用SET修改指定多条数据
  • 写在最后的话
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档