Я загружаю данные в базу данных из формы в Oracle Apex. Форма загружает данные для одного отдела (11 строк с процессом PL/SQL), но я хочу дублировать данные для нескольких отделов, используя список выбора нескольких элементов.
Список выбора возвращает varchar2, разделенный двоеточием. (ИЕ 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.
Есть много способов разделить такие строки, вот пример с 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
Другой метод использует регулярное выражение, которое можно комбинировать с другими упомянутыми столбцами, чтобы завершить весь процесс в 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;
Для этого вы можете использовать API APEX_STRING.SPLIT. Он доступен в Apex 5.1.