ABAP Native SQL概述

ABAP Native SQL概述

🔍 Native SQL基础

定义

术语”Native SQL”是指可以静态传输到数据库接口的本机SQL接口的所有语句。

Native SQL的特点



graph TD
    A[Native SQL] --> B[数据库特定]
    A --> C[直接传输]
    A --> D[完整语言]
    
    B --> B1[特定数据库语法]
    C --> C1[不变传输]
    D --> D1[完整SQL支持]

与ABAP语法的关系

Native SQL语句不属于ABAP的语言范围,不遵循ABAP语法。ABAP仅包含用于隔离其中可以列出Native SQL语句的程序段的语句。

🗄️ Native SQL机制

工作原理

  1. 传输过程:Native SQL语句从本地SQL接口不变地传输到数据库系统并执行
  2. 语法规则:使用相关数据库的完整SQL语言范围
  3. 表访问:所寻址的数据库表不必在ABAP字典中声明

SAP特定的本地SQL语句

有一小组SAP特定的本地SQL语句,由本地SQL接口以特定方式处理。

📝 Native SQL语法

基本语法

1
2
3
EXEC SQL PERFORMING <form>.
<Native SQL statement>
ENDEXEC.

语句区域定义

EXECENDEXEC 语句定义ABAP程序中可以列出一个或多个Native SQL语句的区域。

语句处理规则

  1. 数据库特定语句:对于所寻址的数据库系统的程序接口有效的所有SQL语句都可以在EXEC和ENDEXEC之间列出,特别是DDL(数据定义语言)语句。

  2. 不变传输:这些SQL语句从Native SQL接口传递到数据库系统基本不变。语法规则由数据库系统指定,特别是数据库对象的区分大小写规则。

  3. 语句分隔:如果语法允许单个语句之间的分隔符,则可以在EXEC和ENDEXEC之间包括许多本地SQL语句。

  4. SAP特定元素:可以在EXEC和ENDEXEC之间指定SAP特定的本地SQL语言元素。这些语句不会直接从Native SQL接口传递到数据库,但会适当地进行转换。

💡 Native SQL示例

完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
REPORT zdemonative_sql.

* 定义工作区
DATA: BEGIN OF wa,
connid TYPE spfli-connid,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
END OF wa.

* 定义变量
DATA c1 TYPE spfli-carrid VALUE 'LH'.

* 执行Native SQL
EXEC SQL PERFORMING loop_output.
SELECT connid, cityfrom, cityto
INTO :wa
FROM SPFLI
WHERE carrid = :c1
ENDEXEC.

* 处理子程序
FORM loop_output.
WRITE: / wa-connid, wa-cityfrom, wa-cityto.
ENDFORM.

输出示例

1
2
3
0400  FRANKFURT  NEW YORK
2402 FRANKFURT BERLIN
0402 FRANKFURT NEW YORK

🔍 Native SQL的使用场景

1. 数据定义语言(DDL)

1
2
3
4
5
6
7
EXEC SQL.
CREATE TABLE TEMP_TABLE (
ID NUMBER(10),
NAME VARCHAR2(100),
CREATED_DATE DATE
)
ENDEXEC.

2. 复杂查询

1
2
3
4
5
6
7
8
EXEC SQL.
SELECT a.*, b.name
INTO :wa_a, :wa_b
FROM table1 a
JOIN table2 b ON a.id = b.id
WHERE a.status = :status
ORDER BY a.created_date DESC
ENDEXEC.

3. 批量操作

1
2
3
4
5
6
7
8
9
10
11
12
* 使用PERFORMING处理多行结果
EXEC SQL PERFORMING process_rows.
SELECT id, name, email
INTO :wa_id, :wa_name, :wa_email
FROM customers
WHERE active = 1
ENDEXEC.

FORM process_rows.
" 处理每一行数据
WRITE: / wa_id, wa_name, wa_email.
ENDFORM.

🎯 Native SQL vs Open SQL

特性 Native SQL Open SQL
语法 数据库特定 ABAP标准
表访问 任何数据库表 ABAP字典表
DDL支持 完全支持 不支持
转换 无转换 自动转换
性能 高(直接) 中等(通过接口)
维护性 低(依赖数据库) 高(独立)

⚠️ Native SQL注意事项

1. 数据库依赖性

  • 语法因数据库而异
  • 需要了解特定数据库的SQL方言
  • 移植性差

2. 性能考虑

  • 直接访问数据库,性能更高
  • 但失去了ABAP的优化层
  • 需要手动管理事务

3. 安全风险

  • 可能存在SQL注入风险
  • 需要谨慎处理用户输入
  • 建议使用参数化查询

🔧 最佳实践

1. 参数化查询

1
2
3
4
5
6
7
8
9
10
11
12
* 安全的参数化查询
DATA: lv_carrid TYPE spfli-carrid,
wa_spfli TYPE spfli.

lv_carrid = 'LH'.

EXEC SQL.
SELECT *
INTO :wa_spfli
FROM spfli
WHERE carrid = :lv_carrid
ENDEXEC.

2. 错误处理

1
2
3
4
5
6
7
8
9
10
11
* 添加错误处理
DATA: lv_rc TYPE i.

EXEC SQL.
INSERT INTO temp_table (id, name) VALUES (1, 'Test')
INTO :wa_spfli
ENDEXEC.

IF sy-subrc <> 0.
WRITE: / 'SQL执行错误:', sy-subrc.
ENDIF.

3. 事务管理

1
2
3
4
5
6
7
8
9
10
11
12
13
* 显式事务控制
EXEC SQL.
BEGIN WORK
ENDEXEC.

" 执行操作
EXEC SQL.
INSERT INTO table1 VALUES (1, 'Test')
ENDEXEC.

EXEC SQL.
COMMIT WORK
ENDEXEC.

📊 使用建议

适合使用Native SQL的场景

  1. 需要使用特定数据库功能
  2. 执行复杂DDL操作
  3. 性能要求极高且了解目标数据库时
  4. 临时表操作

不适合使用Native SQL的场景

  1. 需要跨数据库兼容
  2. ABAP字典表操作
  3. 标准SAP功能已满足需求时
  4. 维护性要求高