Я использую Oracle BI Publisher 11g (11.1.1.3.0) и пытаюсь получить доступ к данным XML, хранящимся в таблице базы данных. К сожалению, у меня возникло несколько проблем, и в настоящий момент я в замешательстве.
У меня есть таблица:
create table xml_test(
id number,
data1 clob,
data2 xmltype
);
desc xml_test
Name Null? Type
-------------------------------------------- -------- ---------------------------
ID NUMBER
DATA1 CLOB
DATA2 PUBLIC.XMLTYPE
Заполнено данными XML:
insert into xml_test values (
1,
to_clob(xmltype.createxml('<top><foo>I''m first foo !</foo><bar>I''m first bar !</bar></top>')),
xmltype.createxml('<top><foo>I''m first foo !</foo><bar>I''m first bar !</bar></top>')
);
insert into xml_test values (
2,
to_clob(xmltype.createxml('<top><foo>I''m second foo !</foo><bar>I''m second bar !</bar></top>')),
xmltype.createxml('<top><foo>I''m second foo !</foo><bar>I''m second bar !</bar></top>')
);
insert into xml_test values (
3,
to_clob(xmltype.createxml('<top><foo>I''m third foo !</foo><bar>I''m third bar !</bar></top>')),
xmltype.createxml('<top><foo>I''m third foo !</foo><bar>I''m third bar !</bar></top>')
);
commit;
И я могу запросить его с помощью sqlplus:
column id format 99
column data1 format a35
column data2 like data1
select * from xml_test;
ID DATA1 DATA2
--- ----------------------------------- -----------------------------------
1 <top><foo>I'm first foo !</foo><bar <top>
>I'm first bar !</bar></top> <foo>I'm first foo !</foo>
<bar>I'm first bar !</bar>
</top>
2 <top><foo>I'm second foo !</foo><ba <top>
r>I'm second bar !</bar></top> <foo>I'm second foo !</foo>
<bar>I'm second bar !</bar>
</to
3 <top><foo>I'm third foo !</foo><bar <top>
>I'm third bar !</bar></top> <foo>I'm third foo !</foo>
<bar>I'm third bar !</bar>
</top>
select xt.id,
xmlcast(xmlquery('//foo' passing xt.data2 returning content) as varchar2(30)) "FOO",
xmlcast(xmlquery('//bar' passing xt.data2 returning content) as varchar2(30)) "BAR"
from xml_test xt;
ID FOO BAR
--- ------------------------------ ------------------------------
1 I'm first foo ! I'm first bar !
2 I'm second foo ! I'm second bar !
3 I'm third foo ! I'm third bar !
select xt.id, t.*
from xml_test xt,
xmltable('//top' passing xt.data2
columns "FOO" varchar2(15) path 'foo',
"BAR" varchar2(15) path 'bar') t;
ID FOO BAR
--- --------------- ---------------
1 I'm first foo ! I'm first bar !
2 I'm second foo I'm second bar
3 I'm third foo ! I'm third bar !
Для меня все выглядит хорошо, но когда я пытаюсь создать модель данных в BI Publisher, я сталкиваюсь с несколькими проблемами.
Согласно документации Oracle Использование данных, хранимых как большой символьный объект (CLOB) в модели данных Я должен иметь возможность изменить тип CLOB столбца data1 на тип XML в моделировщике данных. В моей установке я не могу этого сделать, потому что мне никогда не предлагалось выпадающее меню, показанное в документе. Почему эта опция не доступна для меня? Неправильно ли сделано создание таблицы, или вставка данных выполнена неправильно, или база данных BI Publisher или Oracle установлена или настроена неправильно? Или проблемы между стулом и клавиатурой? Однако при запуске генерации XML значение data1 отображается (правильно) как CLOB:
<ID>1</ID>
<DATA1>
<top><foo>I'm first foo !</foo><bar>I'm first bar !</bar></top>
</DATA1>
<DATA2/>
Но столбец data2 (то есть тип XMLTYPE) вообще не распознается как XML, но BI Publisher показывает, что это строка, и возвращает ноль (см. Выше) при генерировании XML.
Поскольку BI Publisher вообще не распознает XMLTYPE, я попробовал обходной путь. В BI Publisher Query Builder следующее:
select "XML_TEST"."ID" as "ID",
xmlcast(xmlquery('//foo' passing "XML_TEST"."DATA2" returning content) as varchar2(30)) as "FOO",
xmlcast(xmlquery('//bar' passing "XML_TEST"."DATA2" returning content) as varchar2(30)) as "BAR"
from "XML_TEST" "XML_TEST"
Работает как положено:
<ID_1>1</ID_1>
<BAR>I'm first bar !</BAR>
<FOO>I'm first foo !</FOO>
Но потом, на удивление (для меня), это не получается:
/* This works on Query Builder but XML generation fails. */
select "xt"."ID" as "ID", t.bar_xml_test as "B1", t.foo_xml_test as "B2"
from "XML_TEST" "xt",
xmltable('//top' passing xt.data2
columns "foo_xml_test" varchar2(15) path 'foo',
"bar_xml_test" varchar2(15) path 'bar') as t
Query Builder считает, что все в порядке, но генерация XML завершается неудачно:
XML Parsing Error: no element found
Почему xmlcast + xmlquery работает, а xmltable - нет? Разве BI Publisher не любит виртуальные таблицы?