Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle XMLTABLE未按预期工作_Oracle_Xpath_Oracle11g_Xmltable - Fatal编程技术网

oracle XMLTABLE未按预期工作

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

我使用EXTRACT方法从Oracle11g数据库中的XML类型列中提取值

如果我的桌子有10行, 在select子句中使用EXTRACT时,我在XPATH中添加了一些条件,如

'/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我已经提供了样本数据。请看您是否能帮忙。非常感谢您的解释。