打开 SQL 和本机 SQL SAP ABAP
本教程的目的不是教你 SQL 或数据库概念,而是向您介绍 ABAP 中的 SQL 多样性
在 ABAP/4 编程语言中,有两种类型的 SQL 被使用。
- 原生 SQL
- 打开 SQL。
无论 R/3 系统使用什么数据库平台,Open SQL 都允许您访问 ABAP 字典中声明的数据库表。
本机 SQL 允许您在 ABAP/4 程序中使用特定于数据库的 SQL 语句。这意味着您可以使用不受 ABAP 字典管理的数据库表,从而集成不属于 R/3 系统的数据。
Open SQL 包含一组 ABAP 语句,用于对 R/3 系统中的中央数据库执行操作。操作结果和任何错误消息与所使用的数据库系统无关。因此,Open SQL 为 R/XNUMX 支持的所有数据库系统提供了统一的语法和语义 SAP仅使用 Open SQL 语句的 ABAP 程序可在任何 R/3 系统中运行,无论使用哪种数据库系统。Open SQL 语句只能与已在 ABAP 字典中创建的数据库表一起使用。
基本开放 SQL 命令
- 选择
- 插入
- 更新
- 调整
- 删除
- 打开游标、获取、关闭游标
例如:
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.
输出 0400 年 28 月 02.1995 日汉莎航空 XNUMX 航班的乘客名单:
打开 SQL 返回代码
所有 Open SQL 语句都会用返回代码填充以下两个系统字段。
SY-SUBRC
在每个 Open SQL 语句之后,如果操作成功,则系统字段 SY-SUBRC 包含值 0;如果操作不成功,则包含非 0 的值。
SY一DBCNT
在 Open SQL 语句之后,系统字段 SY-DBCNT 包含已处理的数据库行数。
本机SQL
正如前面提到的,Native SQL 允许你在 ABAP 程序.
要使用 Native SQL 语句,必须在其前面加上 EXEC SQL 语句,并在其后面加上 ENDEXEC 语句。
句法
EXEC SQL [PERFORMING <form>]. <Native SQL statement> ENDEXEC.
本机 SQL 语句后没有句号。此外,在本机 SQL 语句中,在行首使用引号(“)或星号(*)不会像在正常 ABAP 语法中那样引入注释。您需要知道所选语言中的表和字段名称是否区分大小写 数据库.
在 Native SQL 语句中,数据使用主机变量在数据库表和 ABAP 程序之间传输。这些变量在 ABAP 程序中声明,并在 Native SQL 语句中以冒号 (:) 开头。您可以使用基本结构作为主机变量。例外的是,INTO 子句中的结构被视为其所有字段都单独列出。
与 Open SQL 一样,在 ENDEXEC 语句之后,SY-DBCNT 包含处理的行数。在几乎所有情况下,在 ENDEXEC 语句之后,SY-SUBRC 都包含值 0。
打开 SQL – 性能规则
为了提高 SQL 和 ABAP 程序的性能,应该注意以下规则:
保持结果集较小
- 使用 where 子句
- 如果只需要数据库中一条记录,请尽可能使用 SELECT SINGLE。
尽量减少传输的数据量
- 限制行数
- 如果只需要表中的某些字段,则使用 SELECT INTO … 语句
- 限制列数
- 使用聚合函数
尽量减少数据传输次数
- 避免嵌套选择循环
- 另一种选择是使用 SELECT .. FOR ALL ENTRIES 语句。此语句通常比在内部表的循环期间执行大量 SELECT 或 SELECT SINGLE 语句更有效率。
- 使用字典视图
- 在 FROM 子句中使用连接
- 在 where 子句中使用子查询
最小化搜索开销
- 在 where 子句中使用索引字段
- 访问数据库时,始终确保使用正确的索引。
减少数据库负载
- Buffer博士开发的技术萃取的
- 逻辑数据库
- 避免重复访问数据库
使用内部表 Buffer 记录
- 为了避免多次执行相同的 SELECT(从而产生重复选择),可以使用 HASHED 类型的内部表来提高性能。