RPGLE中如何在不实际读取记录的前提下删除记录
RPGLE不读取记录实现删除的正确方法
这道面试题考的是RPG原生文件操作的细节,你之前答嵌入式SQL确实没踩中得分点:不管是定位删除还是带条件的搜索型删除,SQL引擎执行时都会先把匹配记录读入内存缓冲区做校验、加锁,确实存在实际的记录读取动作,只是你在代码里没显式写读操作而已,面试官的说法没问题。
真正满足“不实际读取记录就删除”要求的实现有两种,都是基于RPG原生操作,全程不会把记录内容加载到程序输入缓冲区,也不会触发高层逻辑的记录读取:
- 按键值/相对记录号(RRN)删除指定记录:直接用
DELET操作码,不需要提前执行CHAIN/READ等任何读操作。
很多RPG开发者有个思维定式,觉得删除前必须先读记录定位,实际上DELET本身就支持直接传入定位参数(键值、RRN),直接定位删除即可。自由格式示例代码如下:
注意这种方式因为不读取记录内容,没法在删除前校验记录其他字段的值,必须确保传入的定位参数准确,避免误删。// 声明待操作文件,开启更新权限 dcl-f EMPFILE usage(*update) keyed; // 方式1:直接传入员工编号作为键值删除匹配记录,全程无读取动作 dcl-c delEmpNo 10086; delet (delEmpNo) EMPREC; // EMPREC是EMPFILE对应的记录格式名 // 方式2:直接传入RRN删除指定位置的记录 dcl-s delRRN packed(5:0) inz(123); delet (delRRN) EMPREC; - 全量删除某个文件成员的所有记录:直接调用
CLRPFM命令清空成员数据段即可。
这种方式不会做逐记录扫描、读取,直接重置文件成员的数据段指针,删除效率比逐行删除高几个量级,适合整表清空的场景。示例代码:// 调用系统API QCMDEXC执行CLRPFM命令 dcl-pr QCMDEXC extpgm; cmd char(3000) const; cmdlen packed(15:5) const; end-pr; dcl-s cmdStr char(200); cmdStr = 'CLRPFM FILE(LIB01/EMPFILE) MBR(*FIRST)'; QCMDEXC(cmdStr, %len(cmdStr));
补充:只有当你使用不带参数的
DELET操作码时,才需要提前通过读操作把记录指针定位到目标记录,这种场景下才会触发记录读取。这道题的核心考点就是看你知不知道DELET支持直接传参定位,不需要前置读操作。
内容的提问来源于stack exchange,提问作者Kunal Roy
相关产品推荐
相关产品推荐

