* 定义工作区 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.