Oracle Apex提交页面时如何将两个页项值作为两行插入表
Oracle Apex 多页项批量插入解决方案
思路可行性验证
你提到的按命名规则筛选页项循环插入的思路是可行的,但直接查APEX_APPLICATION_PAGE_ITEMS有两个需要注意的点:
- 该视图存储的是页项元数据,如果你后续新增其他符合
P1_ITEM%命名规则但不需要插入的页项,会导致误插入无效数据 - 动态获取页项值需要调用
V()函数或者APEX_UTIL.GET_SESSION_STATE方法,不能直接引用元数据返回的页项名字符串
循环插入的具体实现
可以根据页项是否会后续扩容,选择两种实现方案:
方案1:固定页项硬编码(最稳妥,适合页项数量固定的场景)
直接在页面提交后的「处理」节点新增一个PL/SQL类型的处理逻辑,代码如下:
-- 可根据需求加非空判断 IF :P1_ITEM_01 IS NOT NULL THEN INSERT INTO mos.items (str) VALUES (:P1_ITEM_01); END IF; IF :P2_ITEM_02 IS NOT NULL THEN INSERT INTO mos.items (str) VALUES (:P2_ITEM_02); END IF;
该方案不需要循环,执行效率最高,也不会出现页项误匹配的问题。
方案2:动态匹配循环插入(适合页项后续会扩容的场景)
如果你后续会不断新增符合命名规则的页项,不想每次修改插入代码,可以用你提到的动态筛选方案,代码示例如下:
FOR rec IN ( SELECT item_name FROM APEX_APPLICATION_PAGE_ITEMS WHERE application_id = :APP_ID AND page_id = :APP_PAGE_ID AND item_name LIKE 'P1_ITEM%' ) LOOP -- 非空过滤 IF APEX_UTIL.GET_SESSION_STATE(rec.item_name) IS NOT NULL THEN INSERT INTO mos.items (str) VALUES (APEX_UTIL.GET_SESSION_STATE(rec.item_name)); END IF; END LOOP;
注意必须加上application_id和page_id的过滤条件,避免匹配到其他应用、其他页面的同名页项。
内容的提问来源于stack exchange,提问作者Oguen
相关产品推荐
相关产品推荐

