Open SQL 数据库访问 (★★★★) #abap #abap-sql
概览表
访问方式
语法
用途
单条记录
SELECT SINGLE
读取一行
SELECT 循环
SELECT ... ENDSELECT
逐行处理
数组读取
SELECT ... INTO TABLE
批量读取到内表
表连接
SELECT ... INNER JOIN
组合多个表
Open SQL 与 Native SQL
特性
Open SQL
Native SQL
数据库无关性
是
否(依赖特定数据库)
语法
ABAP 特有
特定数据库的 SQL
缓冲
自动
无
建议
推荐使用
仅在必要时使用
SELECT SINGLE(单条记录) 1 2 3 4 5 6 7 8 9 SELECT SINGLE carrid connid cityfrom cityto FROM spfli INTO ls_connection WHERE carrid = iv_carrid AND connid = iv_connid. IF sy-subrc = 0. " 找到记录 ENDIF.
返回第一条 匹配的记录
必须检查 sy-subrc 以确认是否成功
sy-dbcnt = 读取的行数(0 或 1)
SELECT 循环(逐行处理) 1 2 3 4 5 6 7 8 9 10 SELECT carrid connid fldate seatsmax seatsocc FROM sflight INTO ls_flight WHERE carrid = iv_carrid AND connid = iv_connid. ls_flight-percentage = ls_flight-seatsocc / ls_flight-seatsmax * 100. APPEND ls_flight TO et_flights. ENDSELECT.
每次循环将一行数据填入工作区
多次数据库访问 (每行一次)
数组读取(批量读取) 1 2 3 4 5 SELECT carrid connid fldate seatsmax seatsocc FROM sflight INTO TABLE et_flights WHERE carrid = iv_carrid AND connid = iv_connid.
单次数据库访问 填充整个内表
比 SELECT 循环更高效
数组读取(INTO TABLE)= 对所有行只需一次数据库访问 。SELECT 循环 = 多次数据库访问 (每行一次)。出于性能考虑,应始终优先使用数组读取。
INNER JOIN(多表访问) 1 2 3 4 5 6 SELECT s~carrid s~connid s~fldate c~carrname FROM scarr AS c INNER JOIN sflight AS s ON c~carrid = s~carrid INTO TABLE gt_combined WHERE s~carrid = iv_carrid.
SQL 相关系统字段
字段
含义
sy-subrc
0 = 成功,4 = 未找到数据,8 = 错误
sy-dbcnt
处理的行数
WHERE 子句运算符
运算符
示例
=
WHERE carrid = 'LH'
<>
WHERE carrid <> 'LH'
> / <
WHERE seatsocc > 100
LIKE
WHERE cityfrom LIKE 'New%'
IN
WHERE carrid IN ('LH', 'AA')
BETWEEN
WHERE fldate BETWEEN '20240101' AND '20241231'
考试/测试模式
场景/关键词
答案
“SELECT SINGLE 保证有结果?”
否 — 需检查 sy-subrc
“INTO TABLE 与 INTO 循环?”
数组读取 (一次访问)与循环 (多次访问)
“SELECT 后 sy-subrc = 4?”
未找到数据
“Open SQL 的优势?”
数据库无关
相关笔记