2014-07-02 111 views
0

我有一个Oracle表,它将大量数据存储为CLOBs中的XML。例如,它将状态整数映射到自定义状态名称。下面是一些简单的XML:创建Oracle XML视图

<metadata> 
    <states> 
     <state status="0" label="New" /> 
     <state status="1" label="Data-Entry" /> 
     <state status="25" label="Approve-Data" /> 
    </states> 
</metadata> 

我写了一个查询,提取说,从数据库中的XML并确定状态的名字给予25状态整数

select id As METADATA_ID, EXTRACTVALUE(xmltype(XML_STRING), '/metadata/states/state[@status="25"]/@label') from metadata; 

结果:342, "Approve-Data"。到现在为止还挺好。上面的查询为该状态创建了所有不同标签的列表。我今天准备这样做,虽然是创建一个视图有以下的列:

METADATA_ID | STATUS_NUM | LABEL 
342    0     "New" 
342    1     "Data-Entry" 
342    25    "Approve-Data" 
674    3     "Something-Else" 
674    6     "More-Data" 

这样,我可以看看了所有的不同映射为不同的元数据ID和进行正常的Oracle连接。鉴于地位数字有差距,是否有办法做到这一点?

+0

我不确定这是可能的直SQL。您可以使用PL/SQL并遍历可能的'status'值的范围。 –

回答

1

好消息大家以下!我发现了一个使用XMLTABLE的解决方案(请原谅我的任意大写实践):

select 
    m.id as metadata_id, x.* 
FROM 
    metadata m, 
    XMLTABLE('/metadata/states/state' 
     PASSING xmltype(m.xml_string) 
     COLUMNS status_id INTEGER PATH '@status', 
       status_label VARCHAR(32) PATH '@label') x; 
0

你以某种方式需要将一行乘以它所具有的状态标记的数量。

1解决方案,

进行更改,因此对extractValue它会返回@状态/标签; @状态/标签;像 0 /新; 1 /数据输入; 25 /批准数据

有选择分隔符/的问题;这样你的标签就没有了。

然后convert string to table

第二个解决方案

Create numbers table,并与表加入。然后,而不是state[@status="25"]使用state[i]在那里我将来自数字表

3解决方案

在这个答案的第一个链接,你可以找到例如与XMLSEQUENCE提取行