You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle APEX中如何插入复选框组选中的多个分类值

Oracle APEX 复选框组实现订单关联多分类实现方案

前置说明

单条订单关联多个分类属于多对多关系,你当前直接在order表存id_category的结构不适合这类场景(单条订单主记录会被拆成多行,冗余大量主表数据),推荐先新建一张订单-分类关联表,逻辑更清晰也更好维护:

-- 新建关联表(推荐执行,不想改表结构可以跳过,后续逻辑适配原表即可)
create table order_category_rel (
  id_order number not null,
  id_category number not null,
  constraint pk_order_cat_rel primary key (id_order, id_category),
  constraint fk_rel_order foreign key (id_order) references "ORDER"(id_order),
  constraint fk_rel_cat foreign key (id_category) references category(id_category)
);

具体实现步骤

    1. 表单页创建复选框组项
      打开订单新建/编辑表单页面,新建页面项,类型选择复选框组,项名按APEX命名规则设为P{页面号}_ORDER_CATEGORIES,比如页面是10页就叫P10_ORDER_CATEGORIES:
    • 值列表(LOV)配置:类型选「SQL查询」,输入以下SQL,让复选框显示分类名称、实际提交分类ID:
      select description d, id_category r
      from category
      order by description
      
    • 如果是编辑已有订单的页面,配置项的源属性:源类型选「SQL查询(返回冒号分隔的值)」,SQL写以下内容,自动回显已经关联的分类:
      -- 用关联表的版本
      select listagg(id_category, ':') within group (order by id_category)
      from order_category_rel
      where id_order = :P{页面号}_ID_ORDER
      
      (如果用原order表存关联,就把上面SQL的表名换成"ORDER"即可,P{页面号}_ID_ORDER是你页面上存储订单主键的隐藏项名)
    1. 配置提交后的数据存储逻辑
      在页面处理区域,新建一个「PL/SQL代码」类型的处理,执行顺序放在APEX自动生成的订单主表单行处理(也就是写入order主表数据的那个处理)之后,代码内容如下:
    -- 1. 先清除当前订单原有分类关联,避免残留旧数据
    delete from order_category_rel
    where id_order = :P{页面号}_ID_ORDER;
    -- 用原order表的话替换成:delete from "ORDER" where id_order = :P{页面号}_ID_ORDER;
    
    -- 2. 把复选框选中的分类批量插入关联表,APEX复选框多值默认用冒号分隔,用内置函数直接拆分
    insert into order_category_rel (id_order, id_category)
    select :P{页面号}_ID_ORDER, column_value
    from table(apex_string.split(:P{页面号}_ORDER_CATEGORIES, ':'));
    /* 用原order表的话替换成下面的插入语句,注意把主表必填字段补上
    insert into "ORDER" (id_order, id_category, 其他主表必填字段名...)
    select :P{页面号}_ID_ORDER, column_value, :P{页面号}_其他主表对应项名...
    from table(apex_string.split(:P{页面号}_ORDER_CATEGORIES, ':'));
    */
    
    给这个PL/SQL处理加触发条件:当表单的保存/提交按钮被点击时执行,避免其他页面操作误触发数据删除写入。

注意事项:

  1. order是Oracle保留关键字,所有SQL里引用这个表必须加双引号写成"ORDER",否则会报语法错误,业务表命名建议避开这类保留字。
  2. 如果你的分类ID本身包含冒号,需要把复选框组的「分隔符」属性改成其他不会出现在ID里的特殊字符(比如竖线|、逗号),对应上面SQL里的拼接符、拆分符同步替换即可。
  3. 复选框组如果没有选中任何值,提交时对应的项值是空,上面的逻辑会自动清空该订单的所有分类关联,不需要额外写判空逻辑。

内容的提问来源于stack exchange,提问作者Marta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:03:29