Извлечение значений из разделенного двоеточиями varchar с последующим циклом для вставки данных в базу данных

Я загружаю данные в базу данных из формы в Oracle Apex. Форма загружает данные для одного отдела (11 строк с процессом PL / SQL), но я хочу дублировать данные для нескольких отделов, используя список выбора нескольких элементов.

Список выбора возвращает разделенный двоеточиями varchar2. (IE 856: 456: 455: 455) Эти числа представляют идентификатор отдела, который будет единственным изменением в каждой загруженной записи, все остальные строки будут продублированы.

Я думаю, мне нужно разделить varchar2 по двоеточию в массив, а затем перебрать массив, чтобы загрузить каждый в базу данных вместе с другими 10 столбцами, которые не изменятся.

Я попробовал несколько методов разделения, чтобы преобразовать значения, разделенные двоеточиями, в значения, разделенные запятыми, но ничего не помогло. Не удалось найти метод строка-массив в Pl / SQL. Я предполагаю, что это будет немного сложнее, чем это.

l_input varchar2(4000) := :P4_ADDITIONAL_LE ||':'|| :P4_LEGAL_ENTITY_ID;

Это единственный код, который у меня есть, который добавляет начальный отдел к дополнительным депозитам. выбран из списка выбора. Я загрузил это в тестовую таблицу, и он выводит 861: 842: 882: 844: 843. Я хочу, чтобы каждое из этих значений было доступно для отдельной загрузки с использованием цикла for в процессе PL / SQL.

Всего 2 ответа


Есть много способов разбить такие строки, вот пример с xmltable где я помещаю элементы в коллекцию и перебираю их:

declare 
  type tbl_var is table of varchar2(5);
  v_deps tbl_var;
  v_str varchar2(100) := 鮵: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 операторе SQL:

Insert into table_name(dept_no,col1,col2,col3)
with source as (select 鮵: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;

Есть идеи?

10000