SAP ABAP 中 OpenSQL和Native SQL-05
本教程的目的不是教您 SQL 或数据库概念,而是向您介绍 ABAP 中的 SQL 多样性
在 ABAP/4 编程语言中,使用了两种类型的 SQL。
- Native 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 字典中创建的数据库表。
基本的OpenSQL 命令
- 选择
- 插入
- 更新
- 调整
- 删除
- 打开光标,获取,关闭光标
例子
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 语句后没有句点。 此外,在Native SQL 语句的行首使用引号 (") 或星号 (*) 不会像在普通 ABAP 语法中那样引入注释。 您需要知道所选数据库中的表名和字段名是否区分大小写。
在 Native SQL 语句中,数据使用主机变量在数据库表和 ABAP 程序之间传输。 这些在 ABAP 程序中声明,并在 Native SQL 语句中以冒号 (😃 开头。 您可以使用基本结构作为主变量。 在特殊情况下,INTO 子句中的结构被视为其所有字段都单独列出。
与 Open SQL 中一样,在 ENDEXEC 语句之后,SY-DBCNT 包含已处理的行数。 在几乎所有情况下,SY-SUBRC 在 ENDEXEC 语句之后都包含值 0。
Open SQL – 性能规则
为了提高 SQL 和 ABAP 程序的性能,应该注意以下规则 -
保持结果集小
- 使用 where 子句
- 如果只需要数据库中的一条记录,请尽可能使用 SELECT SINGLE。
最小化传输的数据量
- 限制行数
- 如果表中只需要某些字段,请使用 SELECT INTO … 语句
- 限制列数
- 使用聚合函数
最小化数据传输次数
- 避免嵌套选择循环
- 另一种选择是使用 SELECT … FOR ALL ENTRIES 语句。 此语句通常比在内部表的循环期间执行大量 SELECT 或 SELECT SINGLE 语句更有效。
- 使用字典视图
- 在 FROM 子句中使用联接
- 在 where 子句中使用子查询
最小化搜索开销
- 在 where 子句中使用索引字段
- 访问数据库时,请始终确保使用了正确的索引。
减少数据库负载
- 缓冲
- 逻辑数据库
- 避免重复的数据库访问
使用内部表缓冲记录
- 为了避免多次执行相同的 SELECT(因此有重复的选择),可以使用 HASHED 类型的内部表来提高性能。
参考:https://www.guru99.com/native-open-sql.html