парсинг xml файлов в pl/sql

Рейтинг: 0Ответов: 1Опубликовано: 05.06.2023

Ребят, нужна помощь в понимаю парсинга 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

Ответы

▲ 0

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