打开 SQL 和本机 SQL SAP ABAP

⚡ 智能摘要

Open SQL 和 Native SQL SAP ABAP 描述了 ABAP 程序访问数据库的两种方式。Open SQL 以独立于数据库的方式操作数据字典表,而 Native SQL 则将特定于数据库的语句直接传递给平台。

  • 🧭 核心区别: Open SQL 处理 ABAP 字典中声明的表,而 Native SQL 处理字典未管理的表。
  • 🧱 可移植性原则: Open SQL 提供统一的语法、语义和错误消息,因此程序可以在所有受支持的数据库上正常运行。 SAP.
  • ⌨️ 命令集: SELECT、INSERT、UPDATE、MODIFY、DELETE 和游标语句涵盖了中央数据库上的所有 Open SQL 操作。
  • 🔢 回程 Codes: SY-SUBRC 报告成功,值为 0;SY-DBCNT 报告已处理的数据库行数。
  • ???? 原生 SQL 接口: 语句用 EXEC SQL 和 ENDEXEC 括起来,不带结束句点,并通过以冒号开头的主机变量交换数据。
  • 🚀 绩效纪律: 保持结果集较小,限制字段,避免嵌套 SELECT 循环,使用索引字段,并将记录缓冲在哈希内部表中。

Open SQL 和 Native SQL SAP ABAP

什么是 Open SQL 和 Native SQL?

本教程的目的不是教你 SQL 或者说数据库概念,但目的是向您介绍 ABAP 中 SQL 的多样性。

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

  1. 原生 SQL
  2. 打开 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 字典中创建的数据库表一起使用。

Open SQL 几乎是所有程序的默认选择,因此首先介绍其命令集。

基本开放 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 返回 Codes

所有 Open SQL 语句都会用返回代码填充以下两个系统字段。

系统字段
SY-SUBRC 在每个 Open SQL 语句之后,如果操作成功,则系统字段 SY-SUBRC 包含值 0;如果操作不成功,则包含非 0 的值。
SY一DBCNT 在 Open SQL 语句之后,系统字段 SY-DBCNT 包含已处理的数据库行数。

💡提示: 务必在语句执行后立即检查 SY-SUBRC 字段。后续的 ABAP 命令会覆盖该字段,导致原始结果丢失。

当表位于 ABAP 字典之外时,Open SQL 无法访问它,此时 Native SQL 将接管。

本机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 绕过了 SAP Open SQL 的表缓冲区和自动客户端处理功能。客户端字段必须由程序提供,并且语句只能在其编写时所针对的数据库平台上运行。

Open SQL 与 Native SQL:主要区别

这两个接口都连接到同一个数据库,但它们在可移植性、缓冲能力以及可访问的对象方面有所不同。下表总结了这些实际差异。

标准 Open SQL 本机SQL
表格内容 仅在 ABAP 字典中声明的表 数据库中的任何表,包括字典之外的表。
便携性 可在所有受支持的数据库上运行 SAP 与某个数据库平台的语法绑定
句法 带有结算期间的 ABAP 语句 EXEC SQL … ENDEXEC 中包含的本地语句,没有结束句点
数据传输 通过 INTO 实现工作区和内部表格 主机变量前面加冒号
客户端处理和缓冲 自动客户端处理和表格缓冲 没有自动客户端处理功能,而且 SAP 缓冲区被绕过
典型用途 日常访问 R/3 应用程序数据 集成不属于 R/3 系统的数据

因此,Open SQL 是默认选项,以下规则使其运行速度更快。

打开 SQL – 性能规则

为了提高 SQL 和 ABAP 程序的性能,应该注意以下规则:

保持结果集较小

  • 使用 where 子句
  • 如果只需要数据库中一条记录,请尽可能使用 SELECT SINGLE。

尽量减少传输的数据量

  • 限制行数
  • 如果只需要表中的某些字段,则使用 SELECT INTO … 语句
  • 限制列数
  • 使用聚合函数

尽量减少数据传输次数

  • 避免嵌套选择循环
  • 另一种选择是使用 SELECT .. FOR ALL ENTRIES 语句。此语句通常比在内部表的循环期间执行大量 SELECT 或 SELECT SINGLE 语句更有效率。
  • 使用字典视图
  • 在 FROM 子句中使用连接
  • 在 where 子句中使用子查询

最小化搜索开销

  • 在 where 子句中使用索引字段
  • 访问数据库时,始终确保使用正确的索引。

减少数据库负载

  • Buffer博士开发的技术萃取的
  • 逻辑数据库
  • 避免重复访问数据库

使用内部表 Buffer 记录

  • 为了避免多次执行相同的 SELECT 语句(从而导致重复的 SELECT 语句), 内表 使用 HASHED 类型可以提高性能。

常见问题

通常不会。原生 SQL 会跳过这一步。 SAP 由于使用了表缓冲区,因此缓冲式 Open SQL 读取通常更快。只有当需要 Open SQL 不提供的特定平台功能时,原生 SQL 才更具优势。

是的。Open SQL 会自动将当前客户端添加到客户端依赖表的 WHERE 子句中。而原生 SQL 则不会,因此程序必须自行提供 MANDT 参数,以避免读取外部客户端数据。

嵌套循环每次都会向外部表中的每条记录发送一次数据库调用,这会增加网络往返次数。而连接、字典视图或 SELECT … FOR ALL ENTRIES 语句只需一次调用即可检索相同的数据。

是的。ABAP 开发工具中的 AI 助手可以检测嵌套的 SELECT 循环、缺失的 WHERE 条件和未使用的列,然后提出重写语句的建议。该建议仍需在 ST05 或 SAT 事务中进行运行时检查。

AI扫描器会标记每个EXEC SQL块,解释其中特定于平台的语法,并生成等效的Open SQL语句。开发人员会在传输前确认字典表是否存在并测试结果。

总结一下这篇文章: