SAP ABAP 中的 Open SQL 和 Native SQL
本教程的目标不是教授您 SQL 或数据库概念,而是向您介绍 ABAP 中的 SQL 多样性。
在 ABAP/4 编程语言中,有两种 SQL 被使用。
- 本地 SQL
- OPEN SQL。
Open SQL 允许您访问 ABAP 字典中声明的数据库表,而与 R/3 系统使用的数据库平台无关。
Native SQL 允许您在 ABAP/4 程序中使用特定于数据库的 SQL 语句。这意味着您可以使用不受 ABAP 字典管理的数据库表,从而集成不属于 R/3 系统的数据。
Open SQL 由一组 ABAP 语句组成,这些语句在 R/3 系统的中央数据库上执行操作。操作的结果和任何错误消息均独立于所使用的数据库系统。因此,Open SQL 为 SAP 支持的所有数据库系统提供了统一的语法和语义。仅使用 Open SQL 语句的 ABAP 程序可以在任何 R/3 系统中运行,无论使用的数据库系统是什么。Open SQL 语句只能与在 ABAP 字典中创建的数据库表一起使用。
基本 Open SQL 命令
- SELECT
- INSERT
- UPDATE
- 修改
- DELETE
- OPEN CURSOR, FETCH, CLOSE CURSOR
示例
TABLES SBOOK. DATA C TYPE CURSOR, WA LIKE SBOOK. OPEN CURSOR C FOR SELECT * FROM SBOOK WHERE CARRID = 'LH ' AND CONNID = '0400' AND FLDATE = '19950228' ORDER BY PRIMARY KEY. DO. FETCH NEXT CURSOR C INTO WA. IF SY-SUBRC <> 0. CLOSE CURSOR C. EXIT. ENDIF. WRITE: / WA-BOOKID, WA-CUSTOMID, WA-CUSTTYPE, WA-SMOKER, WA-LUGGWEIGHT, WA-WUNIT, WA-INVOICE. ENDDO.
输出 1995 年 2 月 28 日汉莎航空 0400 航班的乘客名单
Open SQL 返回码
所有 Open SQL 语句都会用返回码填充以下两个系统字段。
SY-SUBRC
在每个 Open SQL 语句之后,如果操作成功,系统字段 SY-SUBRC 包含值 0;如果不成功,则包含非 0 值。
SY-DBCNT
在 Open SQL 语句之后,系统字段 SY-DBCNT 包含处理的数据库行数。
本地 SQL
如前所述,Native SQL 允许您在 ABAP 程序中使用特定于数据库的 SQL 语句。
要使用 Native SQL 语句,您必须在前面加上 EXEC SQL 语句,并在后面加上 ENDEXEC 语句。
语法
EXEC SQL [PERFORMING <form>]. <Native SQL statement> ENDEXEC.
Native SQL 语句后面没有句点。此外,在原生 SQL 语句的行首使用倒引号(“)或星号(*)不会像在常规 ABAP 语法中那样引入注释。您需要了解所选 数据库中表名和字段名是否区分大小写。
在 Native SQL 语句中,数据通过主机变量在数据库表和 ABAP 程序之间传输。这些变量在 ABAP 程序中声明,并在 Native SQL 语句中以冒号(:)开头。您可以使用基本结构作为主机变量。例外地,INTO 子句中的结构被视为其所有字段均已单独列出。
与 Open SQL 一样,在 ENDEXEC 语句之后,SY-DBCNT 包含处理的行数。在几乎所有情况下,ENDEXEC 语句后的 SY-SUBRC 包含值 0。
Open SQL – 性能规则
为了提高 SQL 和进而提高 ABAP 程序的性能,应注意以下规则:
保持结果集较小
- 使用 where 子句
- 如果只需要数据库中的一条记录,请尽可能使用 SELECT SINGLE。
最小化传输数据量
- 限制行数
- 如果只需要表中的特定字段,请使用 SELECT <field1> <field2> INTO … 语句。
- 限制列数
- 使用聚合函数
最小化数据传输次数
- 避免嵌套的 SELECT 循环
- 另一种选择是使用 SELECT .. FOR ALL ENTRIES 语句。此语句通常比在内部表的 LOOP 中执行大量 SELECT 或 SELECT SINGLE 语句更有效。
- 使用字典视图
- 在 FROM 子句中使用 Joins
- 在 where 子句中使用子查询
最小化搜索开销
- 在 where 子句中使用索引字段
- 访问数据库时,请务必确保正在使用正确的索引。
减少数据库负载
- 缓冲
- 逻辑数据库
- 避免重复的数据库访问
使用内部表缓冲记录
- 为了避免多次执行相同的 SELECT(从而产生重复的 SELECT),可以使用类型为 HASHED 的内部表来提高性能。