我正在从Oracle Apex中的表单将数据上传到数据库。 表单上载了单个部门的数据(使用PL / SQL进程时为11行),但是我想使用多个项目选择列表来复制多个部门的数据。
选择列表返回以冒号分隔的varchar2。 (IE 856:456:455:455) 这些数字代表部门ID,这将是上载的每条记录中唯一的更改,所有其他行都将重复。
我想我需要将varchar2按冒号分成一个数组,然后遍历该数组以将每个数组以及其他10个不变的列上载到数据库。
我尝试了几种分割方法将冒号分隔的值转换为逗号分隔的值,但是没有任何效果。在Pl / SQL中都找不到数组方法的字符串。我猜它会比这复杂一些。
l_input varchar2(4000) := :P4_ADDITIONAL_LE ||':'|| :P4_LEGAL_ENTITY_ID;
这是我仅有的将初始部门添加到部门的代码。从选择列表中选择。我已经将其上传到测试表,并且正在输出861:842:882:844:843。我希望可以使用PL / SQL进程中的for循环将这些值中的每一个单独上传。
答案 0 :(得分:1)
有很多方法可以拆分此类字符串,这是xmltable
的示例,其中我将元素放入集合中并对其进行迭代:
declare
type tbl_var is table of varchar2(5);
v_deps tbl_var;
v_str varchar2(100) := '861:842:882:844:843';
begin
select trim(column_value) text
bulk collect into v_deps
from xmltable(('"' || replace(v_str, ':', '","') || '"'));
for i in 1..v_deps.count loop
dbms_output.put_line(v_deps(i));
end loop;
end;
输出:
861
842
882
844
843
答案 1 :(得分:0)
另一种方法是使用正则表达式,该表达式实际上可以与提到的其他列组合以在1条SQL语句中完成整个过程:
Insert into table_name(dept_no,col1,col2,col3)
with source as (select '861:842:882:844:843' str, 'aaa' colA, 'bbb' colB, 'ccc' colC from dual)
select regexp_substr(str,'[^:]+', 1, level) dept_id ,colA, colB, colC from source
connect by regexp_substr(str, '[^:]+', 1, level) is not null;
答案 2 :(得分:0)
您可以为此使用API APEX_STRING.SPLIT。可从Apex 5.1获得。