Open SQL 数据库访问 (★★★★)

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 循环更高效
📌数组读取与 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 的优势?” 数据库无关

相关笔记