从冒号分隔的 varchar 中提取值,然后循环将数据插入数据库
Posted
技术标签:
【中文标题】从冒号分隔的 varchar 中提取值,然后循环将数据插入数据库【英文标题】:Extracting Values from a colon seperated varchar then looping through to insert data to a database 【发布时间】:2019-05-17 14:50:54 【问题描述】:我正在从 Oracle Apex 中的表单将数据上传到数据库。 该表单上传单个部门的数据(带有 PL/SQL 流程的 11 行),但我希望使用多项目选择列表为多个部门重复数据。
选择列表返回一个冒号分隔的 varchar2。 (即 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 循环单独上传。
【问题讨论】:
【参考方案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
【讨论】:
【参考方案2】:您可以为此使用 API APEX_STRING.SPLIT。它可从 Apex 5.1 获得。
【讨论】:
【参考方案3】:另一种方法是使用正则表达式,它实际上可以与提到的其他列组合以在 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;
【讨论】:
以上是关于从冒号分隔的 varchar 中提取值,然后循环将数据插入数据库的主要内容,如果未能解决你的问题,请参考以下文章