Oracle 10g:使用XMLSequence和ExtractValue从Clob读取XML值

时间:2012-09-12 22:06:02

标签: xml oracle extract clob

我开始觉得有点昏暗。我已经阅读了很多网页,并尝试了一些方法来做一些看似相对简单的事情。

我有一些XML存储了一个表。该表包含ID和CLOB中的XML。类似的东西:

ID = 1

<?xml version="1.0" encoding="UTF-8" ?>
<CricketGame xmlns="http://www.somewhere.com/cricket/2002/09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2002A" xsi:type="CricketGame" >
<TeamInfo TeamId="WestCountry" />
<SessionInfo SessionId="XhRya5m999988888" RestartSession="false" />
<Errors>
<Error ErrorText="Generic Error" ErrorCode="700" SupplierErrorText="Connection: DECLINED" />
<Error ErrorText="Generic Error" ErrorCode="701" SupplierErrorText="Account Error" />
</Errors>
</CricketGame>

我一直在尝试使用extract和XMLSequence的组合来创建Table,然后使用extractvalue从ErrorText,ErrorCode和SupplierErrorText中获取特定值。我的SQL:

SELECT 
extractvalue(value(p), '/Error/@ErrorText') as errText,
extractvalue(value(p), '/Error/@ErrorCode') as errCode,
extractvalue(value(p), '/Error/@SupplierErrorText') as supErrText
FROM gamestable  s, 
  Table(
    XMLSequence(
    extract(xmltype(s.xml), '/CricketGame/Errors/Error')
    )
  ) p
where 
s.gameID = 1

SQL不会返回任何错误,但它也不会返回数据。

谁能看到我做错了什么?我完全错了吗?它可能与xmlns有关吗?

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

你没错,问题与xmlns有关。我不太了解XML,所以我不能告诉你这是否是一个很好的解决方案,但它至少似乎适用于这个例子:

SELECT 
extractvalue(value(p), '/Error/@ErrorText', 'xmlns="http://www.somewhere.com/cricket/2002/09"') as errText,
extractvalue(value(p), '/Error/@ErrorCode', 'xmlns="http://www.somewhere.com/cricket/2002/09"') as errCode,
extractvalue(value(p), '/Error/@SupplierErrorText', 'xmlns="http://www.somewhere.com/cricket/2002/09"') as supErrText
FROM gamestable  s, 
  Table(
    XMLSequence(
    extract(xmltype(s.xml), '/CricketGame/Errors/Error', 'xmlns="http://www.somewhere.com/cricket/2002/09"')
    )
  ) p
where 
s.gameID = 1