Skip to content

SAP OPEN SQL 数据修改命令文档 (2025.04)

一、核心操作命令

1. INSERT 数据插入

abap
" 单行插入
INSERT INTO ztable VALUES @ls_data.  " 需完整结构体数据 

" 批量插入(支持重复处理)
INSERT ztable FROM TABLE @lt_data 
  ACCEPTING DUPLICATE KEYS.  " 自动跳过主键冲突

关键参数‌:

  • ACCEPTING DUPLICATE KEYS:冲突时跳过记录,SY-SUBRC=4
  • SY-DBCNT:返回实际插入行数 ‌

2. UPDATE 数据更新

abap
" 条件更新(局部字段)
UPDATE ztable SET 
  field1 = @lv_val1,
  field2 = @lv_val2 
WHERE id = '001'.  " 必须包含主键/索引字段 ‌

" 结构体全量更新
UPDATE ztable FROM @ls_data.  " 需包含主键字段 ‌

‌注意事项‌‌:

  • WHERE 条件缺失会导致全表更新 ‌
  • 结构体更新自动匹配字段名‌

3. DELETE 数据删除

abap
" 条件删除
DELETE FROM ztable 
WHERE create_date < '20230101'.  " 需严格验证条件 ‌

" 结构体主键删除
DELETE ztable FROM @ls_data.  " 等效WHERE主键条件 ‌

限制‌:

  • 不支持直接使用内表批量删除(需循环处理)‌

4. MODIFY 数据合并

abap
" 单行合并(存在则更新,不存在则插入)
MODIFY ztable FROM @ls_data.  " 自动检查存在性 ‌

" 批量合并
MODIFY ztable FROM TABLE @lt_data.  " 原子操作提升性能 ‌

二、高级操作技巧

1. 动态SQL

abap
Copy Code
" 动态表名操作
DATA(lv_table) = 'SFLIGHT'.
MODIFY (lv_table) FROM TABLE <itab>.       

" 动态字段更新
DATA(lv_set) = 'PRICE = PRICE * 1.1'.
UPDATE sflight SET (lv_set) WHERE carrid = 'LH'.

2. 事务控制

abap
Copy Code
" 显式事务处理
START OF TRANSACTION.
  INSERT ... 
  UPDATE ...
END OF TRANSACTION.                        

" 隐式事务(MODIFY默认自动提交)

三、性能优化指南

优化策略实现方式
批量操作使用FROM TABLE替代循环单条处理
索引匹配WHERE条件优先使用主键或二级索引
事务控制将多次操作包裹在START/END OF TRANSACTION
字段精简UPDATE时仅指定需修改字段(非全量更新)

系统变量说明‌:

  • SY-SUBRC=0:操作成功
  • SY-DBCNT:返回影响行数

四、综合示例

abap
" 带事务控制的批量更新
DATA: lt_update TYPE TABLE OF zsales.

SELECT * FROM zsales 
  INTO TABLE @lt_update 
  WHERE status = 'NEW' 
  UP TO 100 ROWS.  " 分页控制 ‌

LOOP AT lt_update ASSIGNING FIELD-SYMBOL(<fs>).
  <fs>-status = 'PROCESSED'.
ENDLOOP.

START OF TRANSACTION.
  UPDATE zsales FROM TABLE @lt_update.
  IF sy-subrc = 0.
    COMMIT WORK AND WAIT.  " 显式提交 ‌
  ELSE.
    ROLLBACK WORK.
  ENDIF.
END OF TRANSACTION.