「ABAP」一文带你入门OPEN SQL中的SELECT查询(附超详细案例解析)
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。
💅文章概要: 各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中SELECT语句的介绍,希望大家喜欢!
🤟每日一言: 永远年轻,永远热泪盈眶!
目录
- 前言
- SELECT语句介绍
- SELECT语句变式
- SELECT SINGLE
- 案例演示
- SELECT SEVERAL LINE
- 案例演示
- SELECT并输出打印
- SELECT……ENDSELECT
- SELECT(LOOP……ENDLOOP)
- SELECT……AS
- 动态SELECT语句
- DISTINCT
- FOR UPDATE
- 写在最后的话
前言
各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中SELECT语句的介绍,希望大家喜欢!
SELECT语句介绍
在ABAP中,SELECT语句
用于从数据库表中检索数据,它与传统的SQL语句有相似之处,也有独特于ABAP的特性
,下面是OPEN SQL中标准的代码语法样例:
SELECT <fields>FROM <table>[WHERE <condition>][ORDER BY <fields> [ASC|DESC]][GROUP BY <fields> [HAVING <condition>]][INTO <internal table>][FOR ALL ENTRIES IN <internal table>][UP TO <n> ROWS][HINT <hint>].
参数介绍:
<fields>
:需要检索的字段列表。<table>
:需要从中检索数据的数据库表。<condition>
:可选项,用于过滤检索结果的条件。<internal table>
:可选项,表示检索结果将被存储在内部表中。FOR ALL ENTRIES IN <internal table>
:可选项,表示使用内部表中的值作为条件来检索数据。<n>
:可选项,表示返回的最大行数。<hint>
:可选项,用于优化数据库查询。
SELECT语句变式
在ABAP中,SELECT语句不仅可以检索多行数据,还可以检索单行数据
。为了满足这两种不同的检索需求,ABAP提供了两种SELECT语句的变体:SELECT SINGLE
和SELECT SEVERAL LINE
。
SELECT SINGLE
SELECT SINGLE
语句用于从数据库中检索单个行,并将其存储在内部表中。如果检索到多行数据,则只返回第一行数据
。
以下是SELECT SINGLE语句的语法:
SELECT SINGLE <fields>FROM <table>[WHERE <condition>][ORDER BY <fields> [ASC|DESC]][INTO <internal table>][FOR UPDATE].
PS:
所有参数同SELECT语句介绍一致
案例演示
在这个案例中,首先声明一个sflight表的结构体类型ls_flight
,然后使用SELECT SINGLE
语句检索连接ID为0820
的航班的航空公司、连接ID、日期和价格,并将数据存储在结构体ls_flight中
。最后,使用WRITE语句将检索到的航班数据输出到屏幕上。
DATA: ls_flight TYPE sflight.* Select a flight with connection ID = 0820 and store the data in a structure
SELECT SINGLE carrid, connid, fldate, priceFROM sflightWHERE connid = '0820'INTO ls_flight.* Display the flight data
WRITE: / 'Flight', ls_flight-connid, 'on', ls_flight-fldate,'with airline', ls_flight-carrid, 'costs', ls_flight-price, 'USD'.
SELECT SEVERAL LINE
SELECT SEVERAL LINE
语句用于从数据库中检索多个行,并将其存储在内部表
中。如果没有检索到数据,则返回空内部表
。
以下是SELECT SEVERAL LINE语句的语法:
SELECT <fields>FROM <table>[WHERE <condition>][ORDER BY <fields> [ASC|DESC]][GROUP BY <fields> [HAVING <condition>]][INTO <internal table>][FOR ALL ENTRIES IN <internal table>][UP TO <n> ROWS][HINT <hint>].
PS:
所有参数同SELECT语句介绍一致
案例演示
在这个案例中,首先声明一个内部表it_flight
,其类型为自定义类型ty_flight,该类型包含航空公司、连接ID、日期和价格字段。然后,使用SELECT SEVERAL LINE
语句检索航空公司代码为LH的所有航班的航空公司、连接ID、日期和价格,并将数据存储在内部表it_flight中。最后,使用LOOP AT语句遍历内部表中的每个航班数据
,并使用WRITE语句
将其输出到屏幕上。
TYPES: BEGIN OF ty_flight,carrid TYPE sflight-carrid,connid TYPE sflight-connid,fldate TYPE sflight-fldate,price TYPE sflight-price,END OF ty_flight.DATA: it_flight TYPE STANDARD TABLE OF ty_flight.* Select all flights with airline code 'LH' and store the data in an internal table
SELECT carrid, connid, fldate, priceFROM sflightWHERE carrid = 'LH'INTO TABLE it_flight.* Display the flight data
WRITE: / 'Flights operated by airline LH:'.
LOOP AT it_flight INTO DATA(ls_flight).WRITE: / ls_flight-connid, 'on', ls_flight-fldate, 'costs', ls_flight-price, 'USD'.
ENDLOOP.
SELECT并输出打印
下面介绍ABAP中两种SELECT并且输出打印的方式,其中第一种是先将数据SELECT到结构体变量中,然后输出打印
;第二种是先将数据SELECT到内部表中,然后使用LOOP语句遍历内表最终输出打印到屏幕上
。
SELECT……ENDSELECT
DATA:GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA:GS_SFLIGHT TYPE SFLIGHT.SELECT * INTO GS_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDSELECT.
SELECT(LOOP……ENDLOOP)
DATA: GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA: GS_SFLIGHT TYPE SFLIGHT.SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDLOOP.
SELECT……AS
在ABAP中,使用SELECT AS
可以为查询结果的列定义别名
。这对于使用SELECT语句构建动态SQL语句
和生成报表
非常有用。
SELECT <columns> AS <alias>...
参数介绍
<columns>
:数据库表中字段。<alias>
:字段别名。
下面给出一个详细的案例进行详解:
DATA: GT_SFLIGHT TYPE TABLE OF SFLIGHT,GS_SFLIGHT TYPE SFLIGHT.SELECT CARRID AS 'Airline Code',CONNID AS 'Connection ID'INTO TABLE GT_SFLIGHTFROM SFLIGHTWHERE CARRID = 'LH'.LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.WRITE:/ GS_SFLIGHT-'Airline Code', GS_SFLIGHT-'Connection ID'.
ENDLOOP.
在这个例子中,我们使用SELECT AS
为CARRID和CONNID两个列定义了别名
。这个别名可以在程序中被引用,这样我们就可以避免使用SFLIGHT表中的实际列名
。
在程序的输出中,我们使用GS_SFLIGHT-'Airline Code'
和GS_SFLIGHT-'Connection ID'
来引用别名,这样输出的结果中将显示别名。
动态SELECT语句
在ABAP中,可以使用动态SELECT语句
来构建在运行时构建SQL语句的能力
。这对于需要根据用户输入或条件动态构建SQL语句的应用程序非常有用。
下面给出一个详细的案例进行详解:
DATA: gt_result TYPE TABLE OF sflight,gs_result TYPE sflight,lv_carrid TYPE sflight-carrid.*获取用户输入的Airline Code
PARAMETERS p_carrid TYPE sflight-carrid.*构建动态SQL语句
CONCATENATE 'SELECT * FROM sflight WHERE carrid =' p_carrid INTO lv_sql.
CREATE DATA gt_result TYPE TABLE OF (sflight).
ASSIGN gt_result->* TO FIELD-SYMBOL(<fs_result>).
EXEC SQL PERFORMING <fs_result>INTO TABLE :gt_resultUSING :lv_sql.*输出结果
LOOP AT gt_result INTO gs_result.WRITE:/ gs_result-carrid, gs_result-connid, gs_result-fldate, gs_result-price.
ENDLOOP.
在这个示例中,我们首先使用PARAMETERS语句
定义了一个用户可以输入的参数p_carrid
。然后,我们将该参数与一个SELECT语句的一部分拼接起来,构建了一个动态的SQL语句lv_sql
。
接下来,我们使用CREATE DATA
语句动态创建了一个内部表gt_result
,然后使用ASSIGN
语句将该内部表的指针赋值给一个FIELD-SYMBOL
变量<fs_result>
。
最后,我们使用EXEC SQL语句
执行了动态SQL
语句,并将结果存储在内部表gt_result
中。在循环中,我们遍历内部表并输出结果。
PS:需要注意的是,动态SELECT语句需要使用EXEC SQL语句来执行,而不是ABAP的SELECT语句。此外,我们还可以使用CONCATENATE语句和其他字符串操作函数来构建动态SQL语句。通过使用动态SELECT语句,我们可以根据不同的条件构建不同的SQL语句,并以此实现高度灵活的应用程序。
DISTINCT
[DISTINCT]
为OPEN SQL中SELECT语句的可选项,若选择则自动删除所查询数据的重复项!
在某些场景中,我们需要对查到的数据进行去重
的操作,这时候便需要加上DISTINCT
可选项!
下面给出一个详细的案例进行讲解:
DATA:GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA:GS_SFLIGHT TYPE SFLIGHT.
DATA:GS_LINE(72) TYPE C.GS_LINE = 'CARRID CONNID'.SELECT DISTINCT (GS_LINE) INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDLOOP.
在SFLIGHT数据库表中,CARRID等于‘AC’
的数据有两条,使用了DISTINCT
语句后查询出来的数据便只有一条
了。
FOR UPDATE
在ABAP中,SELECT SINGLE
语句可以使用FOR UPDATE
选项来锁定检索到的行
,以便在事务期间对它们进行更新或删除操作。当使用FOR UPDATE选项时,会在数据库中为检索到的行设置锁,防止其他用户同时修改相同的数据
。
下面给出一个详细的案例进行详解:
START-OF-SELECTION.DATA: lv_name TYPE zemployee-name,lv_salary TYPE zemployee-salary.* Select employee with ID = 123 and lock the row for update
SELECT SINGLE name, salaryFROM zemployeeWHERE id = '123'INTO (lv_name, lv_salary)FOR UPDATE.* Update the employee's salary
lv_salary = lv_salary + 1000.* Commit the changes
COMMIT WORK.
在这个示例中,首先使用SELECT SINGLE语句检索ID为123的员工姓名和工资,并将该行锁定以进行更新
。然后,将员工的工资增加1000,并在事务结束时提交更改。由于该行被锁定,其他用户无法同时更新相同的数据
。
写在最后的话
本文花费大量时间介绍了OPEN SQL中SELECT语句的详细语法
,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!
✨原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力!\textcolor{9c81c1}{点赞,你的认可是我创作的动力!}点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!\textcolor{ed7976}{收藏,你的青睐是我努力的方向!}收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!\textcolor{98c091}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!
相关文章:

「ABAP」一文带你入门OPEN SQL中的SELECT查询(附超详细案例解析)
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…...

【搞透C语言指针】那年我双手插兜, 不知道指针是我的对手
☃️内容专栏:【C语言】进阶部分 ☃️本文概括: 征服C语言指针!一篇文章搞清楚指针的全部要点。 ☃️本文作者:花香碟自来_ ☃️发布时间:2023.3.3 目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义…...

如何从 Android 手机上的 SD 卡恢复已删除的照片
为了扩展手机的存储空间,很多人都会在安卓手机上插入一张SD卡来存储一些大文件,比如电影、照片、视频等。虽然SD卡给我们带来了很大的方便,但我们还是避免不了数据丢失一些事故造成的。您是否正在为 SD 卡上的照片意外丢失而苦恼?…...

01-前端-htmlcss
文章目录HTML&CSS1,HTML1.1 介绍1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标签1.3.5 段落标签1.3.6 加粗、斜体、下划线标签1.3.7 居中标签1.3.8 案例1.4 图片、音频、视频标签1.5 超链接标签1.6 列表标签1.7 表格标签1.8 布…...

【YOLO系列】YOLOv5超详细解读(网络详解)
前言 吼吼!终于来到了YOLOv5啦! 首先,一个热知识:YOLOv5没有发表正式论文哦~ 为什么呢?可能YOLOv5项目的作者Glenn Jocher还在吃帽子吧,hh 目录 前言 一、YOLOv5的网络结构 二、输入端 (1…...

从 ChatGPT 爆火回溯 NLP 技术
ChatGPT 火遍了全网,多个话题频频登上热搜。见证了自然语言处理(NLP)技术的重大突破,体验到通用技术的无限魅力。GPT 模型是一种 NLP 模型,使用多层变换器(Transformer)来预测下一个单词的概率分…...

面了 6 家大厂,并拿下 5 家 offer,进大厂好像也没有那么困难吧....
前言 二月份的时候因为换工作的缘故,陆续参加了华为、蚂蚁、字节跳动、PDD、百度、Paypal 的社招面试,除了字节跳动流程较长,我主动结束面试以外,其他的都顺利拿到了 Offer。 最近时间稍微宽裕点了,写个面经…...
四、Spring对IoC的实现
1.IoC 控制反转 控制反转是一种思想。控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP原则,达到DIP原则。控制反转,反转的是什么? 将对象的创建权利交出去,交给第三方容器负责。将对象和对象之间关系…...

Java语言如何求平方根
问题 在编程时,会遇到求平方根的问题,本次问题讲到如何使用Java来求解平方根。 方法 使用java.lang.Math类的sqrt(double)方法求平方根。Math是java.lang包中的类,所以就可以直接使用这个类。Double为对象中的基本类型。例如求正整数16的平方…...
C++20中的span容器
一.span容器 span 是 C20 中引入的一个新的标准容器,它用于表示连续的一段内存区间,类似于一个轻量级的只读数组容器。 span 是一个轻量级的非拥有式容器,它提供了对连续内存的引用。 span 的主要用途是作为函数参数,可以避免不…...

codeforces周赛div3#855记录
目录 总结 一,A. Is It a Cat? 二,B. Count the Number of Pairs 三,C1. Powering the Hero (easy version) 四,C2. Powering the Hero (hard version) 总结 真羡慕ACM校队的同学,能AC七八题,甚至ak …...

2022年考研结果已出,你上岸了吗?
官方公布:2022年考研人数为457万。 2月20号左右,全国考研分数已经陆续公布,现在已经过去一周左右的时间了,你上岸了吗,还是在等调剂,或者已经知道落榜不知道何去何从? 考研的热潮在近几年席卷…...

2023 工业互联网平台:智慧制硅厂 Web SCADA 生产线
我国目前是全球最大的工业硅生产国、消费国和贸易国,且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识,随着我国“双碳”目标的推进,光伏产业链快速发展,在光伏装机需求的带动下,…...

6-2 SpringCloud快速开发入门:声明式服务消费 Feign实现消费者
声明式服务消费 Feign实现消费者 使用 Feign实现消费者,我们通过下面步骤进行: 第一步:创建普通 Spring Boot工程 第二步:添加依赖 <dependencies><!--SpringCloud 集成 eureka 客户端的起步依赖--><dependency>…...

Git-学习笔记01【Git简介及安装使用】
Java后端 学习路线 笔记汇总表【黑马-传智播客】Git-学习笔记01【Git简介及安装使用】Git-学习笔记02【Git连接远程仓库】Git-学习笔记03【Git分支】目录 01-git的历史 02-git和svn的对比 03-git的安装 04-向本地仓库中添加文件 05-修改文件内容并提交 06-删除本地仓库中…...

【Python】控制自己的手机拍照,并自动发送到邮箱
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 今天这个案例,就是控制自己的摄像头拍照, 并且把拍下来的照片,通过邮件发到自己的邮箱里。 想完成今天的这个案例,只要记住一个重点:你需要一个摄像头 思路…...

八股文(二)
一、 实现深拷贝和浅拷贝 1.深拷贝 function checkType(any) {return Object.prototype.toString.call(any).slice(8, -1) }//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝 //如果获得的数据是可遍历的&#…...

在CANoe/CANalyzer中观察CAN Message报文的周期Cycle
案例背景: 该篇博文将告诉您,如何直观的,图示化的,查看CAN网络中各CAN Message报文的周期变化。 优质博文推荐阅读(单击下方链接,即可跳转): Vector工具链 CAN Matrix DBC CAN M…...
Linux命令·ls
ls命令是linux下最常用的命令。ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单。 通过ls 命令不仅可以查看linux文件夹包含的文件而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息…...

Mysql InnoDB 存储引擎笔记
1 存储引擎 简介 Mysql 存储引擎有多种:包括 MyISAM、InnoDB 和 Memory。 其中MyISAM 和 INNODB 的区别: 事务安全(MyISAM不支持事务,INNODB支持事务);外键 MyISAM 不支持外键, INNODB支持外…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...