Вывести запрос DB2 SQL XML в уникальный файл XML - PullRequest
2 голосов
/ 28 февраля 2010

Упрощенно, я создаю набор элементов XML с запросом SQL, например:

SELECT XMLELEMENT(NAME "project", project) FROM project;
<project>project1</project>
<project>project2</project>
...

Теперь мне нужно обернуть эту последовательность в основной элемент «projects» и вывести ее в красивый XML-файл с отступами.

Я пробовал следующим образом:

db2 -x "SELECT XMLSERIALIZE(CONTENT XMLELEMENT(NAME "projects", XMLAGG(XMLELEMENT(NAME "project", project))) AS CLOB INCLUDING XMLDECLARATION) FROM project" >output.xml

И я получаю что-то вроде:

<projects><project>project1</project><project>project2</project>...</projects>

XMLAGG работает (он обернул все в элемент основного проекта). Тем не менее, с 100 тыс. Проектов db2 жалуется на «Значение SQL0433N» ... это слишком долго. SQLSTATE = 22001"

Кроме того, output.xml не имеет отступов (все в одной строке).

Как правильно достичь этого?

С уважением, David

Ответы [ 2 ]

1 голос
/ 03 марта 2010

Возможно, вы не получите нужного отступа, но по крайней мере получите один гарантированный разрыв строки на строку, если вы не XMLAGG весь документ в один огромный CLOB.

Распространенное табличное выражение - это удобный способ указать столбец сортировки, который не должен отображаться в последнем операторе выбора.

WITH xmlheader( xmlrow, sort_seq ) AS ( VALUES ( 
' <?xml version="1.0" ?>'|| CHR( 10 ) || '<projects>', 1 ))
,
xmlbody( xmlrow, sort_seq ) AS ( VALUES( 
'<project>Replace this with your XMLSERIALIZE query, '
|| 'but only focus on generating XML for one project per row. '
|| 'This will enable you to specify a narrower data type, such AS VARCHAR(1000) '
|| 'for each row, and you will get each separate project '
|| 'followed by the normal newline at the end of each SQL row. '
|| 'No XMLAGG is necessary in this query.</project>', 2))
,
xmlfooter( xmlrow, sort_seq) AS ( VALUES( '</projects>', 3 ))

SELECT xmlrow FROM (
    SELECT xmlrow, sort_seq FROM xmlheader
    UNION ALL 
    SELECT xmlrow, sort_seq FROM xmlbody
    UNION ALL 
    SELECT xmlrow, sort_seq FROM xmlfooter
) AS fullxml 
ORDER BY sort_seq
1 голос
/ 02 марта 2010

Похоже, вам нужно создать временную таблицу и поместить туда открывающий и закрывающий тег вручную, а также результаты вашего запроса (обязательно добавьте несколько пробелов для отступа результатов вашего запроса). Если у вас есть столбец идентификаторов и вы разместили все в правильном порядке в таблице, то вам просто нужно запросить таблицу (без идентификатора, но упорядоченный по идентификатору) и сохранить результаты в файл.

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

Последний вариант, когда вы используете исходный запрос и публикуете результаты с помощью внешнего инструмента.

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