我正在尝试在Oracle PL / SQL中创建一些XML文件的视图。 XML文件的数据内容存在的问题是单个路径通常有多个数据条目,如下所示:
<priip>
<data>
<properties>
<priipMonitoringInterval>daily</priipMonitoringInterval>
<priipMonitoringStartDate>2017-06-30T13:51:03.168000</priipMonitoringStartDate>
<permittedKIDDownloadJurisdictions>
<item>DE</item>
<item>AT</item>
</permittedKIDDownloadJurisdictions>
</properties>
</data>
</priip>
因此我收到一条错误消息:
ORA-19279:XPTY0004 - XQuery动态类型不匹配:预期的单例序列 - 得到多项序列
在这里,显然问题在于路径:
priip/data/properties/permittedKIDDownloadJurisdictions/item
我们有两个允许的司法管辖区,DE和AT。我无法更改原始XML文件,并且我要求将文件中的所有数据输入到PL / SQL视图中。我在下面附上了我的代码示例,显示了我已经尝试过的内容。
create or replace view PRIIPS_XML_VIEW as
select *
from PRIIPS_XML t,
XMLTable(
'$p/priip/data'
passing t.SYS_NC_ROWINFO$ as "p"
columns
priip_monitoring_interval varchar2(20) path 'properties/priipMonitoringInterval',
priip_monitoring_start_date varchar2(26) path 'properties/priipMonitoringStartDate',
kid_download_jurisdiction varchar2(10) path 'properties/permittedKIDDownloadJurisdictions/item'
);
非常感谢任何帮助!
答案 0 :(得分:2)
更改为此。它很脆弱,不适用于&gt; 2个项目元素,在这种情况下,您将需要使用xquery来执行更复杂的操作:
create or replace view PRIIPS_XML_VIEW as
select *
from PRIIPS_XML t,
XMLTable(
'$p/priip/data'
passing t.SYS_NC_ROWINFO$ as "p"
columns
priip_monitoring_interval varchar2(20) path 'properties/priipMonitoringInterval',
priip_monitoring_start_date varchar2(26) path 'properties/priipMonitoringStartDate',
kid_download_jurisdiction varchar2(10) path
kid_download_jurisdiction1 varchar2(10) path 'properties/permittedKIDDownloadJurisdictions/item[1]',
kid_download_jurisdiction2 varchar2(10) path 'properties/permittedKIDDownloadJurisdictions/item[2]'
);
答案 1 :(得分:2)
由于Item不止一次出现,因此应该使用第二个XMLTABLE操作来处理。这将给出项目内容的标准化视图。
请参阅https://livesql.oracle.com/apex/livesql/file/content_E8GUH32UJN0EDKXRSV30ZUX4V.html