Oracle Apex 5 Shuttle组件多选内容未按预期插入多行问题咨询
解决Oracle Apex 5中Shuttle组件多选批量插入问题
你是不是遇到了Shuttle选中多个part_name后,没法把每个选中项单独插入表中一行的问题?我来给你梳理下核心问题和解决办法:
首先得明确:Apex的Shuttle组件默认会把所有选中项的返回值用**冒号(:)**拼接成一个字符串,比如你选中part_name1和part_name3,绑定变量(比如:P1_SHUTTLE)的值就是part_name1:part_name3。如果直接把这个字符串插入表中,只会生成一行,这就是最常见的错误原因。
正确的PL/SQL处理代码
我们需要把拼接的字符串拆分成单个值,再循环插入每一行。Apex 5已经支持APEX_STRING包,用它来拆分非常方便:
场景1:Shuttle返回值就是单独的part_name
假设你的Shuttle列表条目里,显示标签是part - part_nameX,返回值设置为part_nameX,那代码可以这么写:
DECLARE -- 定义数组存储拆分后的选中项 l_selected_items apex_t_varchar2; BEGIN -- 拆分Shuttle的选中值,分隔符用默认的冒号 l_selected_items := apex_string.split(:P1_SHUTTLE, ':'); -- 循环数组,逐个插入 FOR i IN 1..l_selected_items.COUNT LOOP INSERT INTO your_target_table (part, part_name) VALUES ('你的固定part值', l_selected_items(i)); -- 这里的part是你说的那个主项固定值 END LOOP; COMMIT; END;
场景2:Shuttle返回值包含part和part_name组合
如果你的Shuttle返回值是part|part_nameX(比如为了同时获取主项和子项),那需要再拆分每个组合项:
DECLARE l_selected_items apex_t_varchar2; l_part VARCHAR2(100); l_part_name VARCHAR2(200); BEGIN l_selected_items := apex_string.split(:P1_SHUTTLE, ':'); FOR i IN 1..l_selected_items.COUNT LOOP -- 拆分part和part_name,用|作为分隔符 l_part := apex_string.get_element(l_selected_items(i), 1, '|'); l_part_name := apex_string.get_element(l_selected_items(i), 2, '|'); INSERT INTO your_target_table (part, part_name) VALUES (l_part, l_part_name); END LOOP; COMMIT; END;
关键注意事项
- 确认Shuttle的分隔符:可以在Shuttle组件的属性里查看“分隔符”设置,默认是冒号,如果改了,代码里的分隔符要对应。
- 列表条目设置:确保Shuttle的“返回值”是你需要存储的内容,比如要存
part_name就别返回整个显示标签(part - part_nameX),否则还要额外拆分字符串。 - 旧版本兼容:如果你的环境刚好不支持
APEX_STRING,可以用REGEXP_SUBSTR来循环拆分,比如:
DECLARE l_shuttle_val VARCHAR2(4000) := :P1_SHUTTLE; l_idx NUMBER := 1; l_single_item VARCHAR2(1000); BEGIN LOOP l_single_item := REGEXP_SUBSTR(l_shuttle_val, '[^:]+', 1, l_idx); EXIT WHEN l_single_item IS NULL; INSERT INTO your_target_table (part, part_name) VALUES ('你的固定part值', l_single_item); l_idx := l_idx + 1; END LOOP; COMMIT; END;
内容的提问来源于stack exchange,提问作者user8956060
相关产品推荐
相关产品推荐

