Проблемы при формировании XML

SergeyMat
Дата: 02.06.2006 21:50:30
Добрый день!

Надеюсь на вашу помощь, сам уже голову сломал. Необходимо оптимальное решение. Есть таблица, в которой хранятся разные SQL запросы для отчетов (несколько тысяч). Необходимо по любому из этих запросов сформировать XML. Проблема заключается в том, что при формировании XML в качестве тэгов для имен выступают имена столбцов. А имена там еще те: и пробелы содержат, и апострофы и вида TO_DATE('11.11.2006','dd.mm.yyyy') - выступает как константа. Запросы переделать не реально.

Пробовал решить проблему с dbms_xmlquery и DBMS_XMLGEN.

Вопрос можно ли при формировании XML c запроса как то повлиять на теги обрамляющие поля. (речь не идет конечно о ROWSET и ROW).
SergeyMat
Дата: 03.06.2006 16:58:42
Да не уточнилю Версия 9.2.0.4
SeaGate
Дата: 03.06.2006 17:06:20
SergeyMat
Добрый день!

Надеюсь на вашу помощь, сам уже голову сломал. Необходимо оптимальное решение. Есть таблица, в которой хранятся разные SQL запросы для отчетов (несколько тысяч). Необходимо по любому из этих запросов сформировать XML. Проблема заключается в том, что при формировании XML в качестве тэгов для имен выступают имена столбцов. А имена там еще те: и пробелы содержат, и апострофы и вида TO_DATE('11.11.2006','dd.mm.yyyy') - выступает как константа. Запросы переделать не реально.

Пробовал решить проблему с dbms_xmlquery и DBMS_XMLGEN.

Вопрос можно ли при формировании XML c запроса как то повлиять на теги обрамляющие поля. (речь не идет конечно о ROWSET и ROW).

Вот чем не вариант:
SELECT XMLELEMENT("Emp", XMLELEMENT("name", e.fname ||' '|| e.lname),
                           XMLELEMENT ( "hiredate", e.hire)) AS "result" 
FROM employees e 
WHERE employee_id > 200 ;
?
SergeyMat
Дата: 03.06.2006 20:10:31
Предложенный вами вариант мне не подходит. Так как я заранее не знаю какие колонки будут выводится в запросе.
Дело в том что запросы в таблице (речь выше) все разные и колонки на выходе тоже разные.
И обратиться непосредственно к колонкам я не всегда могу.
Например может быть такой запрос
select dept, emp, to_date(da,'dd.mm.yyyy'), to_date(da,'dd.mm.yyyy')
from
ну и так далее.
Видно что два последних поля без алиаса и когда получаешь
информацию о выводимых полях например через dbms_sql.describe_columns2, то будет
выведено поле to_date(da,'dd.mm.yyyy') и поле to_date(da,'dd.mm.yyyy') - а к ним не обратишься
с верхнего уровня.
Переписывать все запросы не реально - их несколько тысяч. Поэтому я вижу два варианта:
1) Сделать SELECT над запросом из таблицы и поименовать все поля через AS (но как это сделать
я не знаю)
2) Либо при формировании XML через dbms_xmlquery и DBMS_XMLGEN как-то повлият
на формируемые тэги чтобы они были правильные. То есть чтобы вместо неправильных тегов
to_date(da,'dd.mm.yyyy') и to_date(da,'dd.mm.yyyy') сделать тэги d9,d10 например.
SergeyMat
Дата: 05.06.2006 22:33:28
Может кто встречался с изложенной выше проблемой? Нужна помощь.
Alex Roudnev
Дата: 05.06.2006 22:49:53
SergeyMat
Может кто встречался с изложенной выше проблемой? Нужна помощь.


Может, сделать кучу view с нормальными именами? Но конечно, все это достаточно гемморойно.

(Я на похожую проблему налетал совершенно в другом месте... Авторы, которые дают тагам в XML имена каких то внешних объектов /колонок или там в моем случае было - пекейджей/ явно совсем с головой не дружат, так как в итоге в xml получаются самые фантастические имена тагов, явно не совместимые с синтаксисом /у меня наблюдалось например <c++2.12-5>что то там</c++2.12-5>, и парсер фигел и отпадал...)
Alex Roudnev
Дата: 05.06.2006 22:51:58
А, прочитал - с view отпадает потому как запросы то уже есть... Странно, конечно, что в Оракле при формировании тагов не пропустили имя через какую нибудь простую функцию, приводящую имена в нормальный вид (что то типа _text_to_http_).
Alex Roudnev
Дата: 05.06.2006 22:53:44
Да, а почему это переписать запросы не реально? Простеньким скриптом, который бы делал просто
- если в SELECT попадается имя без AS и если это имя содержит символы недопустимые в XML, то добавляется AS d01 (ну и так далее)
я
Дата: 05.06.2006 23:03:24
если вы можете определить, где в запросе имена столбцов - запихивайте их имена не в тег, а в элемент. CDATA со всем справится.