SAP ABAP 中的 Open SQL 和 Native SQL

本教程的目标不是教授您 SQL 或数据库概念,而是向您介绍 ABAP 中的 SQL 多样性。

在 ABAP/4 编程语言中,有两种 SQL 被使用。

  1. 本地 SQL
  2. 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 的内部表来提高性能。