oracle XMLTABLE未按预期工作
我使用EXTRACT方法从Oracle11g数据库中的XML类型列中提取值 如果我的桌子有10行, 在select子句中使用EXTRACT时,我在XPATH中添加了一些条件,如oracle XMLTABLE未按预期工作,oracle,xpath,oracle11g,xmltable,Oracle,Xpath,Oracle11g,Xmltable,我使用EXTRACT方法从Oracle11g数据库中的XML类型列中提取值 如果我的桌子有10行, 在select子句中使用EXTRACT时,我在XPATH中添加了一些条件,如 '/Items/OperatingSystem/@Version[contains(.,"4.04")]' 在返回的行中,如果XPATH表达式不匹配,则显示null,但显示所有10行 所以我尝试转移到XMLTABLE,因为我发现这是FROM子句中使用的最新版本(摘录已弃用)。我尝试了几个基本查询,发现它只返回与XPAT
'/Items/OperatingSystem/@Version[contains(.,"4.04")]'
在返回的行中,如果XPATH表达式不匹配,则显示null,但显示所有10行
所以我尝试转移到XMLTABLE,因为我发现这是FROM子句中使用的最新版本(摘录已弃用)。我尝试了几个基本查询,发现它只返回与XPATH表达式匹配的行。(在提取case的情况下跳过返回的空行)
我在使用XMLTABLE时发现的一个奇怪问题是-
在本地环境中,当我使用XPATH表达式时
'/Items/OperatingSystem/@Version[contains(.,"4.04")]'
结果,它只选择名称中包含“Dee”的行
但是当我对我们的测试环境运行相同的查询时
它选择所有行,而不是仅选择名称包含“Dee”的行。
我找不到任何暗示为什么会发生这种情况。我尝试了更多的查询,把条件放在其他领域,如年龄等。。但结果是一样的。它正在返回所有行
以下是版本详情-
本地Oracle版本-
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
"CORE 11.2.0.2.0 Production"
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
测试环境Oracle版本-
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
"CORE 11.2.0.3.0 Production"
TNS for HPUX: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
这些版本中是否有与XMLTABLE相关的任何更改
样本数据
假设我有下表
NAME | XMLDATA | CRT_TS
Ubuntu | UbuntuXMLDATA | 20-OCT-2016
Windows | WindowsXMLDATA| 20-OCT-2016
UbuntuXMLDATA
<Items>
<OperatingSystem Name="Ubuntu 12.04" Version="12.04" />
<OperatingSystem Name="Ubuntu 14.04" Version="14.04" />
<OperatingSystem Name="Ubuntu 16.04" Version="16.04" />
</Items>
预期结果
Name | XPATH_OUTPUT
Ubuntu | 14.04
Name | XPATH_OUTPUT
Ubuntu | 12.04
Ubuntu | 14.04
Ubuntu | 16.04
实际结果
Name | XPATH_OUTPUT
Ubuntu | 14.04
Name | XPATH_OUTPUT
Ubuntu | 12.04
Ubuntu | 14.04
Ubuntu | 16.04
我面临的问题是,上述查询在我的本地数据库中运行良好。
但在测试环境中,它返回三行而不是一行。我不知道为什么?是由于Oracle版本(我已经给出了上面的详细信息)不匹配吗?对于任何面临类似问题的人,我可以通过更改XPATH表达式来解决问题。将XPATH表达式更新为
/Items/OperatingSystem[contains(@Version,"4.04")]/@Version
不是使用点(.)操作符获取当前属性的值,而是给出@Version本身。我不确定它是否是一个bug。 在xmltable中,如果不使用别名传递xml。“.”是xml的根 试试这个xpath
'/Items/OperatingSystem/@Version[包含(,“4.04”)]
'/Items/OperatingSystem/@Version[包含(,“OperatingSystem”)]
'/Items/OperatingSystem/@Version[包含(,“Ubuntu”)]
结果总是0.3行
包含(,“xxxx”)]检查整个文档是否包含字符串
解决方案1
更改xquery
'/Items/OperatingSystem[包含(@Version,“14.04”)]/@Version'
解决方案2
为xml添加别名。
XMLTABLE(“$doc/Items/OperatingSystem/@Version[contains(,“4.04”)]”将XMLTYPE(XMLDATA)传递为“doc”)
请发布一些示例数据、查询和意外结果having@Aleksej我已经提供了样本数据。请看您是否能帮忙。非常感谢您的解释。