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

ERR-1002报错求助:多选下拉框提交时无法找到item ID

解决ERR-1002:无法找到对应item ID的问题

看起来你是在Oracle APEX(或PL/SQL Web Toolkit)环境下用原生HTML动态生成多选下拉框,提交页面时触发了这个错误,我来帮你拆解原因和给出解决办法:

为什么会报ERR-1002?

这个错误的核心原因很明确:你用htp.p输出的原生<select>元素(name/id是clients1这类动态值)不是APEX的官方页面项。当页面提交时,APEX会自动尝试把所有表单提交的参数映射到它预先定义的页面项中,找不到对应名称的页面项时,就会抛出"无法找到item ID"的ERR-1002错误。

快速解决方案:改用APEX官方的多选项生成函数

APEX提供了APEX_ITEM.MULTI_SELECT函数,专门用来生成符合APEX规范的多选下拉框,这样生成的表单元素会被APEX正确识别,从根源上避免报错。替换你现有的代码片段:

-- 替换原来的原生select生成代码
htp.p(APEX_ITEM.MULTI_SELECT(
    p_idx        => day + 1, -- 索引值,对应APEX的G_Fn系列变量,比如day+1=1对应G_F1
    p_value      => NULL, -- 默认选中的value,可选
    p_options    => (SELECT name || ':' || id FROM client), -- 格式:显示文本:返回值
    p_attributes => 'class="custom-select" multiple',
    p_show_null  => 'YES',
    p_null_value => '',
    p_null_text  => 'Open this select menu'
));

之后在提交后的PL/SQL逻辑里,你可以通过APEX_APPLICATION.G_F<索引值>来获取选中的多个值,比如APEX_APPLICATION.G_F1就对应day+1=1的多选框选中值,它是数组类型,你可以用循环遍历处理:

FOR i IN 1..APEX_APPLICATION.G_F1.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE('选中的客户端ID:' || APEX_APPLICATION.G_F1(i));
END LOOP;

备选方案:用隐藏页面项收集原生多选框的值

如果你坚持要用原生HTML的多选框,那可以创建一个APEX隐藏页面项(比如P1_SELECTED_CLIENTS),然后在页面提交前用JavaScript把所有多选框的选中值收集到这个隐藏项里,让APEX只处理这个已定义的页面项:

  1. 先在APEX页面里创建一个隐藏类型的页面项P1_SELECTED_CLIENTS
  2. 添加页面提交前的JavaScript代码:
// 收集所有clients开头的多选框选中值,用分号分隔不同日期的选择,逗号分隔单个日期的多个选择
const selectedValues = Array.from(document.querySelectorAll('select[id^="clients"]'))
    .map(select => Array.from(select.selectedOptions).map(opt => opt.value).join(','))
    .join(';');
// 把值赋值给隐藏页面项
document.getElementById('P1_SELECTED_CLIENTS').value = selectedValues;
  1. 提交后在PL/SQL里拆分这个值处理即可:
DECLARE
    l_days_values VARCHAR2(4000) := :P1_SELECTED_CLIENTS;
    l_client_ids VARCHAR2(4000);
BEGIN
    -- 拆分每个日期的选择
    FOR day_val IN (SELECT regexp_substr(l_days_values, '[^;]+', 1, level) AS client_str
                    FROM dual
                    CONNECT BY regexp_substr(l_days_values, '[^;]+', 1, level) IS NOT NULL) LOOP
        l_client_ids := day_val.client_str;
        -- 这里处理单个日期的客户端ID,比如拆分逗号分隔的值
        FOR client_id IN (SELECT regexp_substr(l_client_ids, '[^,]+', 1, level) AS id
                          FROM dual
                          CONNECT BY regexp_substr(l_client_ids, '[^,]+', 1, level) IS NOT NULL) LOOP
            DBMS_OUTPUT.PUT_LINE('客户端ID:' || client_id.id);
        END LOOP;
    END LOOP;
END;

总结

优先推荐用APEX_ITEM.MULTI_SELECT,因为它完全贴合APEX的表单处理机制,不需要额外的JS或复杂的拆分逻辑,能最直接地解决这类错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:24