????作者简介: 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
定义了一个结构体变量,并且对结构体中的carrid
和connid
字段赋值,最后使用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
定义了一个结构体变量和内表变量,并且对结构体中的carrid
和connid
以及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
定义了一个结构体变量和内表变量,并且对结构体中的carrid
和connid
以及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
定义了一个结构体变量,并且对结构体中的carrid
,connid
,fldate
以及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语句的详细语法
,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!
✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下
???? 点赞,你的认可是我创作的动力! \textcolor{9c81c1}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向! \textcolor{ed7976}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! \textcolor{98c091}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!