APEX 21.1 大型多页表单场景下APEX_COLLECTIONS使用问题咨询
Oracle APEX多步骤表单
APEX_COLLECTIONS使用相关问题解答 问题1:选择APEX_COLLECTIONS而非session state的实现思路是否正确?
- 这个思路完全正确,是多步骤跨页表单暂存数据的最优实践之一:
- 按逻辑组拆分存储数据,相比零散的页面/应用级
session state项,结构更清晰,维护成本更低,尤其你拆分了8个逻辑组的场景,优势更明显 APEX_COLLECTIONS本身是会话级存储,生命周期和session state完全一致,会话到期后自动清理,不需要额外开发垃圾回收逻辑- 支持批量增删改查操作,最后统一提交落库时,读取结构化的集合数据比遍历数十个零散
session state项效率高很多
- 按逻辑组拆分存储数据,相比零散的页面/应用级
问题2:使用APEX_COLLECTIONS的性能注意事项(单页2-3个集合场景)
单页使用2-3个集合属于极低负载场景,正常使用不会有性能问题,注意以下规则即可:
- 操作集合时优先使用批量API,比如
apex_collection.add_members比循环调用apex_collection.add_member性能高一个数量级,避免单条循环写入 - 查询集合数据时必须带上
collection_name过滤条件,集合的底层存储表wwv_flow_collections$存储了所有会话的集合数据,带collection_name过滤会命中索引,避免全表扫描 - 冗余集合及时清理:如果用户重填某个逻辑组的数据,先调用
apex_collection.delete_collection删除旧集合再重建,避免无效数据占用存储空间 - 不要在集合的默认字符字段(c001-c050)中存储超过4000字符的内容或大对象,大字段请使用专门的
apex_collection.add_blob/apex_collection.add_clob方法存储,避免拖慢查询效率 - 单页用到多个集合时,统一在页面预处理阶段一次性读取所有需要的集合数据,避免重复查询相同集合
问题3:Session state与集合的最优处理方式
你描述的场景下确实会存在临时的重复存储,但这部分存储开销极低,完全可以忽略,属于合理的设计取舍,最优处理流程参考如下:
- 步骤页加载阶段:先判断对应逻辑组的集合是否存在,存在的话将集合中的字段值赋值给当前页表单项(写入
session state),用于回显用户之前填写的内容 - 步骤页提交(点击下一步)阶段:将当前页
session state中的表单项值写入对应集合,如果不需要保留当前页的session state,可以调用apex_util.clear_page主动清理当前页的项值,避免冗余 - 最终确认提交阶段:直接读取所有集合的数据做校验、落库即可,不需要再读取各步骤页的
session state
如果想要彻底避免重复存储,可以将表单项的数据源直接设置为从对应集合查询的SQL语句,提交时通过动态PL/SQL直接将表单项值写入集合,不需要额外保留session state,但该方案会增加少量代码开发量,可根据项目需求取舍。
内容的提问来源于stack exchange,提问作者McRivers
相关产品推荐
相关产品推荐

