У меня есть следующий фрагмент XML:Использование XMLTABLE и XQuery для извлечения данных из XML
<per:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.something.com/2014/11/bla/webservice.xsd"
xmlns:per="http://www.something.com/2014/11/bla/person">
<per:Initials>E.C.</per:Initials>
<per:FirstName>Erik</per:FirstName>
<per:LastName>Flipsen</per:LastName>
<per:BirthDate>1980-07-01</per:BirthDate>
<per:Gender>Male</per:Gender>
</per:Person>
От этого XML Я хочу, чтобы извлечь некоторые данные в PL/SQL. Я хотел бы использовать XMLTABLE, поскольку функции EXTRACT и EXTRACTVALUE устарели.
Я могу извлечь данные, используя этот запрос:
select pers.Initials,
pers.Firstname
into lsInitials,
lsFirstname
from
XMLTABLE ('*:Person' passing pxRequest
columns Initials PATH '*:Initials',
Firstname PATH '*:FirstName'
) pers;
Я использую шаблоны для пространств имен, так как я на самом деле не волнует, что аббревиатуры передающая сторона использует для пространства имен, я знаю, точный путь, где все равно получить мои данные.
С помощью этого кода у меня есть две вещи, которые мне ломать голову:
- Согласно документации по http://docs.oracle.com/database/121/SQLRF/functions268.htm#SQLRF06232 PATH должна быть необязательными, однако, как только я удалить PATH из раздела COLUMNS, я не получить любые результаты больше.
Edit:
я узнал, что, когда я удалить пространство имен для элементов, и сделал их в верхнем регистре, это работает. Поэтому кажется, что имена столбцов должны соответствовать именам элементов xml, чтобы заставить их работать. Я еще не понял, как заставить его работать с XML с именами.
- В документации также отмечается: «Для каждого результирующего столбца, кроме столбца FOR ORDINALITY, вы должны указать тип данных столбца», однако, как представляется, он работает без него. Также кажется немного лишним указать его для столбцов и для переменных, в которые я вставляю данные. Любая идея, если не указывать типы данных, может вызвать у меня проблемы?
Runnable код образца:
SET SERVEROUTPUT ON;
DECLARE
pxRequest xmltype := xmltype('<per:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.something.com/2014/11/bla/webservice.xsd"
xmlns:per="http://www.something.com/2014/11/bla/person">
<per:Initials>E.C.</per:Initials>
<per:FirstName>Erik</per:FirstName>
<per:LastName>Flipsen</per:LastName>
<per:BirthDate>1980-01-01</per:BirthDate>
<per:Gender>Male</per:Gender>
</per:Person>');
lsInitials varchar2(100);
lsFirstname varchar2(100);
begin
select pers.Initials,
pers.Firstname
into lsInitials,
lsFirstname
from
XMLTABLE ('*:Person' passing pxRequest
columns Initials PATH '*:Initials',
Firstname PATH '*:FirstName'
) pers;
dbms_output.put_line(lsInitials);
dbms_output.put_line(lsFirstname);
end;