парсинг xml файлов в pl/sql
Ребят, нужна помощь в понимаю парсинга xml файлов. Суть задачи: есть таблица условно [Table_request], реквизиты также условно дата подачи запроса, статус .... и реквизит [xml_data] изначально в типе clob. в таблице около 26 тысяч значений. Нужно распарсить все файлы и вытащить значения двух тегов (дата и id_того кто падал) Теперь проблема, не получается распарсишь в одной процедуре сразу все файлы, возможно ли это как-то сделать или нужно в цикле парсить каждый ? данные из парсинга записать в созданую таблицу из двух реквизитов Пример как реализую
type test_rec is record ( date_test date, hld_test varchar2(50) );
type test_tp_tbl is table of test_rec;
v_test_rec test_tp_tbl; --- создали переменную таблицу из двух
реквизитов
--pl/sql
select req.hld_test, to_date(req.date_test, 'YYYY-MM-DD')
into v_test_rec
from z#Table_request x
XMLTable ( '/cc'
passing XMLtype(x.c_xml_data)
columns hld_test varchar2(50) path 'hld'
date_test varchar2(50) path 'date_req'
) req
;
--pl/sql
Ответы (1 шт):
Можно использовать цикл для обработки каждого файла по отдельности. Внутри цикла выполнить парсинг XML-файла и сохранить значения в созданную таблицу. Пример:
DECLARE
v_test_rec test_tp_tbl := test_tp_tbl(); -- пустая переменная таблицы
CURSOR c_requests IS
SELECT x.c_xml_data
FROM z#Table_request x;
BEGIN
FOR req IN c_requests LOOP
-- парсинг XML и извлечение значения тегов
SELECT to_date(x.hld_test, 'YYYY-MM-DD'), x.date_test
INTO v_test_rec
FROM XMLTable('/cc'
PASSING XMLtype(req.c_xml_data)
COLUMNS hld_test VARCHAR2(50) PATH 'hld',
date_test VARCHAR2(50) PATH 'date_req') x;
-- сохраним значения в таблицу
FOR i IN 1..v_test_rec.COUNT LOOP
INSERT INTO your_table (date_test, hld_test)
VALUES (v_test_rec(i).date_test, v_test_rec(i).hld_test);
END LOOP;
COMMIT; -- сохраняем изменения после каждой итерации
END LOOP;
COMMIT; -- сохраняем окончательные изменения
END;