Eri*_*ikL 9 oracle xquery plsql xmltable
我有以下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>
Run Code Online (Sandbox Code Playgroud)
从这个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;
Run Code Online (Sandbox Code Playgroud)
我正在使用通配符作为命名空间,因为我真的不关心发送方用于命名空间的缩写,我知道无论如何获取我的数据的确切路径.
有了这段代码,我有两件事让我困惑:
编辑:
我发现当我删除元素的命名空间并使它们大写时,它可以工作.因此,列名称似乎需要匹配xml元素名称才能使其工作.我还没弄明白如何使用命名空间XML.
可运行的代码示例:
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;
Run Code Online (Sandbox Code Playgroud)
根据您的第一个问题,您链接的文档今天有关于省略的内容PATH:
可选
PATH子句指定 XQuery 结果中由 XQuery 表达式字符串寻址的部分将用作列内容。如果省略
PATH,则假定为 XQuery 表达式列。例如:
(... COLUMNS xyz)相当于
XMLTable(... COLUMNS xyz PATH 'XYZ')您可以使用不同的 PATH 子句将 XQuery 结果拆分为不同的虚拟表列。
xyz假定该列的原因'XYZ'是因为 Oracle 默认情况下不区分大小写(默认为全部大写)。如果您已将列定义为,"aBcD"则该PATH值将被假定为'aBcD'
至于关于指定数据类型的第二个问题:如果您要提取的数据始终是文本数据,那么您可能可以不指定数据类型。
但是,如果您开始处理日期、时间戳、浮点数等内容,那么您可能会遇到问题。您需要使用TO_*函数手动转换它们,或者可以在列定义中指定它们的数据类型。如果不这样做,Oracle 可以自由地以任何合适的方式隐式转换它,这可能会产生意想不到的后果。
| 归档时间: |
|
| 查看次数: |
3012 次 |
| 最近记录: |