У нас есть таблица под названием audit1. Он содержит столбцы «изменения», содержащие XML как blob. Xml выглядит следующим образом. В таблице аудита в основном записываются изменения, которые происходят с другими таблицами через пользовательский интерфейс нашего приложения.Oracle - Итерация по XMLTYPE и возвращаемым узлам в виде отдельных строк
<c>
<f n="VersNo" b="1" a="2"/>
<f n="LstDate" b="20160215" a="20160217"/>
<f n="FileSweepId" b="Test" a="Test1"/>
</c>
- гр выступает за изменения
- F выступает за полем
- н атрибут обозначает имя (как в имени поля)
- б обозначает до значения
- А означает после значения
Мне нужно создать отчет, в котором перечислены все произошедшие изменения красный с определенной даты до определенных таблиц. Как только у меня есть записи audit1, которые меня интересуют, мне нужно перечислить все узлы f в отчете.
Это каждый f-узел в каждой соответствующей записи аудита должен стать строкой в отчете.
Отчет подготовлен при помощи нашего приложения. Что приложение может предпринять для создания отчета является один из следующих:
- SQL-запросов
- или имя хранимой процедуры, которая должна вернуть результат в SYS реф курсором, который будет передан в порядке когда приложение вызывает его. Курсор ref будет вызываться out_cursor.
Я не могу придумать способ достижения этого с помощью одного запроса sql. Итак, я иду по пути записи хранимой процедуры.
Первой проблемой, с которой я столкнулся, является то, как перебирать узлы f в процедуре.
Во-вторых, мне нужно выяснить, как вернуть эти f-узлы вместе с другой информацией из записей аудита в out_cursor.
BEGIN FOR item IN (SELECT auditno, xmltype(changes, 1) as changes, extract(xmltype(changes, 1), '/c/f') as fields from audit1 where runlistno is null and rownum < 2) LOOP dbms_output.put_line(item.auditno || ' ' || item.changes.getStringVal() || ' ' || item.fields.getStringVal()); -- stumped about how to iterate over the f nodes --FOR field in ('select extractvalue(object_value, '/') x FROM TABLE(XMLSequence(' + item.fields.getStringVal() + ') ') FOR field in (select f from XMLTable('for $i in/return $i' passing item.fields columns f varchar2(200) path 'f')) LOOP dbms_output.put_line(field.f); END LOOP; END LOOP; END;
выше PL/SQL, в настоящее время ошибок с:
ORA-19114: XPST0003 - ошибка во время синтаксического анализа выражения XQuery: LPX-00801: XQuery синтаксической ошибки в 'i' 1 для $ i in/return $ i -^ORA-06512: по строке 6