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

Я загружаю данные в базу данных из формы в 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.

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Есть много способов разбить такие строки, вот пример с 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
0 голосов
/ 22 мая 2019

Для этого вы можете использовать API APEX_STRING.SPLIT. Доступен с Apex 5.1.

0 голосов
/ 17 мая 2019

Другой метод - использование регулярного выражения, которое на самом деле можно комбинировать с другими упомянутыми столбцами для завершения всего процесса в 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;
...