提取數據我有下面一段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的文件應該是可選的,但是,只要我在列部分刪除路徑,我不得到任何結果了。
編輯:
我發現,當我刪除其命名空間的元素,使他們大寫,它的工作原理。因此,列名似乎需要匹配xml元素名稱才能使其工作。我還沒有弄清楚如何使它與命名空間XML協同工作。
- 該文檔還記錄「對於除FOR ORDINALITY列之外的每個結果列,必須指定列數據類型」,但是,如果沒有它,它似乎工作正常。爲列和指定數據的變量指定它似乎有點多餘。任何想法,如果不指定數據類型可能會讓我陷入麻煩?
可運行的代碼示例:
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;