У меня есть таблица с именем 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
В этой таблице я храню все файлы XML, которые я получаю через FTP, как 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
Зная это, я попытался получить XML с помощью XMLTABLE, но я понятия не имею, как запустить соединение. Как видите, я попытался связать 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';
Предложения очень приветствуются! (извините за переизбыток информации)
ptcar
не содержит данных из двух других XML-документов. Итак, предположительно, вам нужно объединить данные из XML из всех трех строк. Итак, как же связаны три строки в таблице — исключительно по датеlast_version
? - person Alex Poole   schedule 18.04.2018ptcar.Id = ptrefColumn.Id
,ptrefColumn.Id = ptref.ptrefColumnId
иc.id = ptrefId
(данная переменная) - person Jordec   schedule 18.04.2018id
. Итак, все ваши примеры должны иметьid="512"
? - person Alex Poole   schedule 18.04.2018