【问题标题】:Extracting Values from a colon seperated varchar then looping through to insert data to a database从冒号分隔的 varchar 中提取值,然后循环将数据插入数据库
【发布时间】: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 循环单独上传。

【问题讨论】:

    标签: oracle plsql oracle-apex


    【解决方案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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-13
          • 1970-01-01
          • 2012-11-26
          • 2016-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多