POST-FORMS-COMMIT触发器中用多记录块更新表遇FRM-40737错误求助
解决FRM-40737:POST-FORMS-COMMIT触发器中非法使用受限过程的问题
你遇到的FRM-40737错误,本质是**FIRST_RECORD、NEXT_RECORD这类记录导航内置过程属于受限操作**,而POST-FORMS-COMMIT触发器的执行阶段不允许调用这类过程。这个触发器是在表单提交流程启动后、数据库事务提交前触发的,此时表单已经锁定了记录导航的状态,无法再切换记录行。
解决方案:改用非导航方式遍历块记录
我们可以通过访问块的属性和记录索引来遍历所有行,完全避开导航类操作。下面是修改后的代码:
DECLARE v_total_records NUMBER; v_current_row NUMBER; BEGIN -- 获取目标块的总记录数 v_total_records := GET_BLOCK_PROPERTY('blk', RECORD_COUNT); -- 循环遍历每一行记录 FOR v_current_row IN 1..v_total_records LOOP -- 可选:只处理有变更的记录(避免无意义的更新) IF GET_RECORD_PROPERTY(v_current_row, 'blk', STATUS) IN ('CHANGED', 'INSERTED') THEN UPDATE table1 SET ord_no = :blk.new_val(v_current_row); -- 通过索引直接访问对应行的字段值 END IF; END LOOP; END;
关键说明:
- 用
GET_BLOCK_PROPERTY('blk', RECORD_COUNT)获取块的总记录数,替代导航操作来确定遍历范围 - 通过
字段名(行索引)的方式(:blk.new_val(v_current_row))直接访问指定行的字段值,无需切换当前记录 - 加入
GET_RECORD_PROPERTY的判断,可以只处理被修改或新增的记录,减少不必要的数据库操作,提升性能 - 注意:
POST-FORMS-COMMIT触发器属于表单提交事务的一部分,这里的UPDATE会和表单本身的提交一起执行,不需要额外手动执行COMMIT
内容的提问来源于stack exchange,提问作者Questionnaire
相关产品推荐
相关产品推荐

