Генерация XML из многоуровневой коллекции Oracle PL / SQL - PullRequest
0 голосов
/ 28 февраля 2012

Я довольно любитель Oracle DB и PL / SQL в целом, но, тем не менее, мне нужно взаимодействовать с Oracle DB.

У меня есть хранимая процедура PL / SQL с выходным параметром, который представляет собой многоуровневую коллекцию:

declare
TYPE level_a_type IS RECORD
(
    text varchar2(6),
    data number
);
TYPE level_a_table IS TABLE of level_a_type INDEX BY PLS_INTEGER;
TYPE level_b_type IS RECORD
(
    value number,
    included_table level_a_table
);
TYPE level_b_table IS TABLE of level_b_type INDEX BY PLS_INTEGER;

Я вызываю процедуру и генерирую XML вручную на stdout, как это

set serveroutput on
declare
    result level_b_type;
    n integer;
begin
    n := mypackage.mystoredprocedure(result);
FOR i IN 1 .. result.count LOOP
    dbms_output.putline('<levelb value="'||result(i).level_b_value||'" >');
    FOR k IN 1 .. result(i).included_table.count LOOP
        dbms_output.putline('<levela text="'||result(i).included_table(k).text||'" data="'||result(i).included_table(k).data||" '/>');
    END LOOP;
    dbms_output.putline('</levelb>');
END LOOP;
end;

Однако это довольно громоздко для поддержания. Итак, есть ли ярлык PL / SQL для выполнения чего-то вроде XML_gen(result), который будет ретроспективно смотреть на level_b_table и автоматически генерировать что-то подобное?

<levelb value="1">
<levela text="Hello" data="1" />
<levela text="World" data="2" />
</levelb>

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

В таких случаях я делаю создание объектно-реляционного представления, которое содержит необходимые данные.То есть

create view level_b_v of level_b_table with object identifier (value) as
select <level b stuff>,
    cast (multiset (select <level a stuff>) as level_a_table;

Затем я использую dbms_xmlgen, чтобы выбрать многоуровневый XML из представления (почти просто "select * from level_b_v".

И, если необходимо, используйте dbms_xslprocessor, чтобы применитьтаблица стилей. Это операция DOM, которая использует много памяти (и использует ресурсы как 4-ую степень размера строки), но вы можете сделать так, чтобы DBMS_XMLGEN выбирал данные в чанках и обрабатывал их, если ваши преобразования довольно локализованы.

Вам нужен уникальный идентификатор объекта для представления. И вам нужно создать типы, но вы уже сделали это.

Конечно, есть и другие способы, но это работает очень хорошо для нас для умеренныхданных размером до 10 уровней в иерархии и до 400 МБ результирующего XML.

0 голосов
/ 28 февраля 2012

Я не очень помог, знаю, но взгляните на документацию Oracle XML DB .Oracle предоставляет множество функций для создания / манипулирования XML-документами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...