处理显示Apex Collection的Interactive Grid保存报错问题求助
解决ORA-02014错误:Interactive Grid保存到Apex Collection失败
错误原因
APEX Interactive Grid默认会对数据源执行SELECT FOR UPDATE来锁定行,但APEX_COLLECTIONS是系统视图,内部包含分组、聚合逻辑,不支持SELECT FOR UPDATE操作,因此触发ORA-02014错误。
解决方案
方案1:关闭Interactive Grid的行锁定(推荐,简单直接)
- 打开Interactive Grid的属性面板
- 切换到「Advanced」标签页
- 找到「Row Selection」区域,将「Lock Rows for Update」设置为No
- 保存页面后重新测试
这样APEX就不会自动执行行锁定操作,你的更新代码可以正常调用APEX_COLLECTION.UPDATE_MEMBER完成数据保存。
方案2:改用表类型函数获取Collection数据(保留行锁定)
如果业务需要行锁定功能,将IG的数据源SQL替换为使用APEX_COLLECTION.GET_MEMBERS表函数:
SELECT c001 "Criteria ID", c002 "Criteria Name", c003 "Objective Evidence", c004 "Required Evidence", seq_id, c011 "Part A", c012 "Part B", c013 "Part C", c014 "Part D", c015 "Part E", c016 "Part F", c017 "Part G", c018 "Part H", c019 "Part I", c020 "Part J" FROM TABLE(APEX_COLLECTION.GET_MEMBERS(p_collection_name => 'TABLE_VIEW'))
该函数返回的是表类型数据,支持SELECT FOR UPDATE操作,同时不影响后续的Collection更新逻辑。
额外优化建议
当前保存逻辑仅处理了更新(U状态),如果需要支持新增和删除行,可以补充代码:
BEGIN CASE :APEX$ROW_STATUS WHEN 'U' THEN APEX_COLLECTION.UPDATE_MEMBER ( p_collection_name => 'TABLE_VIEW', p_seq => :seq_id, p_c001 => :CRITERIA_ID, p_c002 => :CRITERIA_NAME, p_c003 => :OBJECTIVE_EVIDENCE, p_c004 => :REQUIRED_EVIDENCE, p_c011 => :PART_A, p_c012 => :PART_B, p_c013 => :PART_C, p_c014 => :PART_D, p_c015 => :PART_E, p_c016 => :PART_F, p_c017 => :PART_G, p_c018 => :PART_H, p_c019 => :PART_I, p_c020 => :PART_J ); WHEN 'C' THEN APEX_COLLECTION.ADD_MEMBER ( p_collection_name => 'TABLE_VIEW', p_c001 => :CRITERIA_ID, p_c002 => :CRITERIA_NAME, p_c003 => :OBJECTIVE_EVIDENCE, p_c004 => :REQUIRED_EVIDENCE, p_c011 => :PART_A, p_c012 => :PART_B, p_c013 => :PART_C, p_c014 => :PART_D, p_c015 => :PART_E, p_c016 => :PART_F, p_c017 => :PART_G, p_c018 => :PART_H, p_c019 => :PART_I, p_c020 => :PART_J ); WHEN 'D' THEN APEX_COLLECTION.DELETE_MEMBER ( p_collection_name => 'TABLE_VIEW', p_seq => :seq_id ); END CASE; END;
内容的提问来源于stack exchange,提问作者Zander
相关产品推荐
相关产品推荐

