SAP ABAP SELECT SINGLE用法

如果只需要选取一个结果数据行,系统在数据库种找到第一个符合条件的数据条目时,就停止查询。单行选择需要在SELECT中使用SINGLE关键字,且INTO自居的结构必须为扁平结构:
SELECT SINGLE INTO FROM …
如果系统找到一个完全符合指定条件的行,SY-SUBRC返回0,否则返回4。
1.选择全部字段
一般不需要指明所有字段,而是在SELECT后用”*”符号,其中INTO语句种的目标对象最好与FROM种的类型相同。
2.选择指定字段
若指定多个数据对象,则需要将这些对象放在括号中,并用逗号隔开,而且其顺序需要与SELECT子句中指明的表字段顺序一致。
如果指定一个扁平结构作为目标对象,且该结构体中的字段多需要选择的字段,则可以使用INTO子句的CORRESPONDING FIELDS选项,该选项只会将SELECT子句中指明字段的内容传送到目标工作区的同名组建中。

DATA:GT_ALV TYPE TABLE OF TY_ALV,
WA_ALV LIKE LINE OF GT_ALV.

LOOP AT GT_ALV INTO WA_ALV.

SELECT SINGLE PSPEL FROM AUFK INTO W_PSPEL
WHERE AUFNR = WA_ALV-AUFNR
AND WERKS = WA_ALV-WERKS.
ENDLOOP.

SELECT SINGLE USNAM BLDAT
INTO (GS_HEAD_IN-USNAM,GS_HEAD_IN-BLDAT)
FROM MKPF
WHERE MBLNR = PV_MBLNR.

ABAP 中 `SELECT SINGLE` 和 `SELECT SINGLE FOR UPDATE` 都是用来从数据库表中选择单条记录的关键字,但它们之间存在一些重要区别: ### 1. **`SELECT SINGLE`** - **功能**:用于从数据库表中检索一条特定记录。它会返回第一条匹配条件的记录。 - **锁定机制**:不会对选中的数据行加锁,其他事务可以同时读取、修改甚至删除这条记录。 - **适用场景**:当你只需要查询某一行的数据,并不需要阻止其他人对该行进行操作时。 #### 示例: ```abap DATA: lv_mara TYPE mara. SELECT SINGLE * FROM mara INTO @lv_mara WHERE matnr = 'MAT001'. ``` 上述代码将从 `mara` 表中查找物料编号为 `'MAT001'` 的记录,并将其存储到变量 `lv_mara` 中。 --- ### 2. **`SELECT SINGLE FOR UPDATE`** - **功能**:同样是获取单一记录,但它会对该记录施加排他性锁定(exclusive lock),防止在同一时间点有其它用户或进程对其进行更改或删除操作,直到当前事务完成为止。 - **锁定机制**:通过 SAP 内置的“更新任务”管理这一锁定状态,在提交 (COMMIT WORK) 或回滚 (ROLLBACK WORK) 后才会释放此锁定。 - **适用场景**:当需要确保所选取的数据在此期间内独占式地被本程序处理而无冲突干扰时使用。 #### 示例: ```abap DATA: lv_mara TYPE mara. SELECT SINGLE * FROM mara INTO @lv_mara FOR UPDATE OF maktx WHERE matnr = 'MAT001'. ``` 这里不仅选出符合条件的一条纪录存入 `lv_mara` ,而且还会针对其加上了 "FOR UPDATE" 锁定标记;假如另一段运行着的 ABAP 程序也尝试访问同一条资料,则会被暂时阻塞住直至前者的交易结束并解除封锁才允许继续往下执行下去。 --- ### 总结对比 | 特性 | SELECT SINGLE | SELECT SINGLE FOR UPDATE | |------------------|-------------------------------------------|---------------------------------------| | 数据锁定 | 不加锁 | 加排他性锁 | | 并发控制 | 允许并发 | 提供更强力的串行化保障 | | 使用场合示例 | 查询只读信息 | 更新共享资源如库存量等敏感型字段值 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值