【发布时间】:2018-04-18 18:38:51
【问题描述】:
我有一个名为XML_INFRASTRUCTURE 的表,其设计如下:
COLUMN_NAME | DATA_TYPE | NULLABLE
-------------|--------------------|--------
XMLI_ID | NUMBER(10,0) | No
FILENAME | VARCHAR2(255 CHAR) | Yes
LAST_VERSION | DATE | Yes
XML_RAW | CLOB | Yes
在此表中,我将通过 FTP 接收的所有 XML 文件存储为 XMLTYPE。我使用 XMLTABLE 来获取信息并且一切正常,直到我开始加入表格。
在XML_INFRASTRUCTURE我有以下数据:
XMLI_ID | FILENAME | LAST_VERSION | XML_RAW
--------|--------------|--------------|--------------------------------
1 | ptcar | 07-JAN-18 | <?xml version="1.0" encoding="ISO-8859-1"?><cern:ptcars creationDate="2018-03-16T19:35:54" xmlns:cern="http://www.website.com/Infrastructure" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.website.com/Infrastructure ../ns/infrastructure.xsd"><cern:ptcar id="1" validFromDate="1996-06-02" validToDate="2007-12-08" ....>
2 | ptrefColumn | 07-JAN-18 | <?xml version="1.0" encoding="ISO-8859-1"?><cern:ptrefColumns creationDate="2018-03-20T11:33:21" xmlns:cern="http://www.website.com/Infrastructure" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.website.com/Infrastructure ../ns/infrastructure.xsd"><cern:ptrefColumn id="279" validFromDate="1998-04-01" validToDate="2001-06-11" ....>
3 | ptref | 07-JAN-18 | <?xml version="1.0" encoding="ISO-8859-1"?><cern:ptrefs creationDate="2018-03-20T11:33:05" xmlns:cern="http://www.website.com/Infrastructure"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.website.com//Infrastructure ../ns/infrastructure.xsd"><cern:ptref id="232" validFromDate="1998-04-01" validToDate="2001-06-11" ....>
接下来我有以下要求:
给定值:ptrefId 和 givenDate
select a.longNameFrench , a.longNameDutch
from ptcar as a,
ptrefColumn as b,
ptref as c
where c.id = ptrefId
and b.id = c.ptrefColumnId
and a.id = b.ptcarId
and a.validFromDate <= givenDate
and a.validToDate >= givenDate
and b.validFromDate <= givenDate
and b.validToDate >= givenDate
and c.validFromDate <= givenDate
and c.validToDate >= givenDate
知道这一点后,我尝试使用 XMLTABLE 获取 XML,但我不知道如何启动并运行连接。如您所见,我尝试链接 XMLTABLE,但现在它已经运行了一个多小时。
SELECT X.LongNameFrench, X.LongNameDutch
FROM XML_Infrastructure,
XMLTABLE(
'$d/*:ptcars/*:ptcar'
PASSING XMLTYPE(XML_Infrastructure.XML_RAW) as "d"
COLUMNS
Id VARCHAR2(10) PATH '@*:id',
LongNameFrench VARCHAR2(60) PATH '@*:longNameFrench',
LongNameDutch VARCHAR2(60) PATH '@*:longNameDutch',
ValidFromDate VARCHAR2(10) PATH '@*:validFromDate',
ValidToDate VARCHAR2(10) PATH '@*:validToDate'
) AS X,
XMLTABLE(
'$d/*:ptrefColumns/*:ptrefColumn'
PASSING XMLTYPE(XML_Infrastructure.XML_RAW) as "d"
COLUMNS
Id VARCHAR2(10) PATH '@*:id',
ValidFromDate VARCHAR2(10) PATH '@*:validFromDate',
ValidToDate VARCHAR2(10) PATH '@*:validToDate'
) AS Y,
XMLTABLE(
'$d/*:ptrefs/*:ptref'
PASSING XMLTYPE(XML_Infrastructure.XML_RAW) as "d"
COLUMNS
Id VARCHAR2(10) PATH '@*:id',
ValidFromDate VARCHAR2(10) PATH '@*:validFromDate',
ValidToDate VARCHAR2(10) PATH '@*:validToDate'
) AS Z
WHERE Z.Id = '512'
AND FILENAME = 'ptcar';
非常欢迎提出建议! (抱歉信息过多)
【问题讨论】:
-
您的 XML 不完整,这并不完全有帮助,而且似乎与您的结果不匹配 - 您要查找的 ID 512 不存在,所以我猜您的意思是 232;但
ptcar文件没有其他两个 XML 文档的数据。因此,据推测,您需要组合来自所有三行的 XML 数据。那么表中的三行是如何相关的 - 纯粹是last_version日期? -
@AlexPoole 所有 xml 文件之间的关系都在要求中注明。
ptcar.Id = ptrefColumn.Id、ptrefColumn.Id = ptref.ptrefColumnId和c.id = ptrefId(给定变量) -
虽然您的三个 XML 文档具有不同的 ID,但它们都不是 512。假设它们都引用同一个
id节点。所以你的例子都应该有id="512"? -
512 实际上只是一个例子。 XML 大约有 5000-15000 行,所以它只是表示 XML_RAW 中存储有 XML。