【发布时间】:2015-08-12 06:28:41
【问题描述】:
我有以下 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 应该是可选的,但是,一旦我从 COLUMNS 部分中删除了 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;
【问题讨论】:
标签: oracle plsql xquery xmltable