Open SQL 保证无论安装了什么数据库系统,都能统一访问。数据库接口会动态将 Open SQL 转换为特定数据库的 SQL。
SELECT 语句结构
1 2 3 4
SELECT <result_columns> <-- SELECT 子句:单行/多行,哪些列 FROM <database_table> <-- FROM 子句:源表或视图 INTO <target_area> <-- INTO 子句:数据放置位置 WHERE <conditions>. <-- WHERE 子句:筛选行
三种 SELECT 变体
变体
语法
使用场景
需要循环
单条记录
SELECT SINGLE ...
读取恰好一行
否
顺序处理
SELECT ... ENDSELECT
逐行处理
是
数组读取
SELECT ... INTO TABLE ...
一次性将所有行复制到内表
否
📌互斥语法
SINGLE、ENDSELECT 和 INTO TABLE 是互斥的。不能在同一个 SELECT 中组合使用。 例外:PACKAGE SIZE(后续介绍)允许将 INTO TABLE 与 ENDSELECT 组合使用。
单条记录访问:SELECT SINGLE
1 2 3 4 5 6
SELECT SINGLE * FROM sflight INTO ls_flight WHERE carrid = 'AA' AND connid = '0017' AND fldate = '20260510'.
方面
说明
用途
从数据库中读取恰好一条记录
最佳实践
在 WHERE 中填写所有关键字段以确保唯一访问
* vs. 列列表
* 读取所有列;指定具体列名更高效
sy-subrc
0 = 找到记录;4 = 未找到记录
CORRESPONDING FIELDS OF
按名称逐组件填充目标区域
不使用 CORRESPONDING
按左对齐填充目标,忽略结构
💡SELECT SINGLE 始终要指定 WHERE 子句
没有 WHERE 时,数据库返回任意的单行 – 几乎永远不是你想要的。
顺序处理:SELECT … ENDSELECT
1 2 3 4 5 6 7
SELECT carrid connid fldate price FROM sflight INTO (lv_carrid, lv_connid, lv_fldate, lv_price) WHERE carrid = 'AA'. " 逐行处理每条记录 WRITE: / lv_carrid, lv_connid, lv_fldate, lv_price. ENDSELECT.
WHERE carrid = 'AA' " 等于 AND connid >= 100 " 比较运算符 AND fldate BETWEEN '20260101' " BETWEEN 范围 AND '20261231' AND planetype LIKE '74%' " 模式匹配 AND currency IN ('USD', 'EUR'). " IN 列表
运算符
含义
=
等于
<>, !=
不等于
>, <, >=, <=
比较
BETWEEN ... AND ...
范围(包含边界)
LIKE
模式匹配(% = 任意字符,_ = 单个字符)
IN (...)
值列表
IS NULL / IS NOT NULL
空值检查
选择屏幕参数
语句
用途
示例
PARAMETERS
单个输入字段
PARAMETERS pa_car TYPE sflight-carrid.
SELECT-OPTIONS
范围/复杂选择
SELECT-OPTIONS so_con FOR gs_flight-connid.
SELECT-OPTIONS 内表结构
使用 SELECT-OPTIONS 声明时,会创建一个包含四个字段的内表:
字段
类型
含义
SIGN
c(1)
I = 包含,E = 排除
OPTION
c(2)
运算符:EQ, NE, BT, CP, GT, GE, LT, LE, NB, NP
LOW
(字段类型)
下限值 / 单值
HIGH
(字段类型)
上限值(用于 BT/NB)
在 WHERE 子句中的使用
1 2 3 4 5 6
PARAMETERS: pa_car TYPE sflight-carrid. SELECT-OPTIONS: so_con FOR gs_flight-connid.
SELECT * FROM sflight INTO TABLE gt_flight WHERE carrid = pa_car " 单值参数 AND connid IN so_con. " SELECT-OPTIONS(IN 运算符)
📌WHERE 中使用 IN 处理 SELECT-OPTIONS
SELECT-OPTIONS 在 WHERE 子句中必须使用 IN 运算符。运行时系统会自动将选择表展开为相应的 SQL 条件。
sy-subrc 检查模式
1 2 3 4 5 6 7
SELECT * FROM sflight INTO TABLE gt_flight WHERE carrid = pa_car AND connid IN so_con.