从冒号分隔的 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 中提取值,然后循环将数据插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

循环通过逗号分隔的 shell 变量

正则表达式从字符串中提取用逗号分隔的字符串

从redshift sql中的varchar中提取值

在 pig 中加载由双冒号 :: 分隔的文件

将充满逗号分隔值的 varchar 传递给 SQL Server IN 函数

需要解析冒号分隔的字符串,如果在plsql中找到匹配的则去掉部分字符串