从冒号分隔的varchar中提取值,然后循环以将数据插入数据库

时间:2019-05-17 14:50:54

标签: oracle plsql oracle-apex

我正在从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循环将这些值中的每一个单独上传。

3 个答案:

答案 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获得。