2011-05-30 157 views
0

我正在运行Oracle BI Publisher 11g(11.1.1.3.0),并试图访问存储在数据库表中的XML数据。不幸的是我有几个问题,目前我很困惑。使用Oracle 11g BI Publisher创建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&apos;m first foo !</foo> 
              <bar>I&apos;m first bar !</bar> 
             </top> 

    2 <top><foo>I'm second foo !</foo><ba <top> 
    r>I'm second bar !</bar></top>  <foo>I&apos;m second foo !</foo> 
              <bar>I&apos;m second bar !</bar> 
             </to 

    3 <top><foo>I'm third foo !</foo><bar <top> 
    >I'm third bar !</bar></top>   <foo>I&apos;m third foo !</foo> 
              <bar>I&apos;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文档Using Data Stored as a Character Large Object (CLOB) in a Data Model我应该能够在数据建模器中将data1列CLOB类型更改为XML类型。在我的安装中,我无法做到这一点,因为我永远不会提示文档中描述的下拉菜单。为什么这个选项不适合我?创建表的方式是错误的,或者是以错误的方式进行数据插入,还是以错误的方式安装或配置BI Publisher或Oracle数据库?或椅子和键盘之间的问题?然而,当我运行XML生成数据1的值显示(正确地)为CLOB:

<ID>1</ID> 
<DATA1> 
<top><foo>I'm first foo !</foo><bar>I'm first bar !</bar></top> 
</DATA1> 
<DATA2/> 

但列数据2(即XMLTYPE类型)无法识别所有的XML但BI Publisher的表明它是一个字符串,并在生成XML时返回null(见上文)。

由于BI Publisher根本无法识别XMLTYPE,所以我尝试了一种解决方法。在BI Publisher的查询生成器执行以下操作:

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 

查询设计器认为这没关系,但XML生成失败:

XML Parsing Error: no element found 

为什么xmlcast + xmlquery可以使用,但xmltable不能使用? BI Publisher不喜欢虚拟表吗?

回答