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