相关疑难解决方法(0)

使用XMLTABLE和xquery从xml中提取数据

我有以下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.

  • 该文档还指出"对于除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', …
Run Code Online (Sandbox Code Playgroud)

oracle xquery plsql xmltable

9
推荐指数
1
解决办法
3012
查看次数

在Oracle中选择xml元素值

我试图从位于Oracle表的XMLTYPE列中的xml元素中提取值.我想要提取的xml元素具有为其定义命名空间的父元素.xml看起来像:

<a>
  <b xmlns="urn:www.someSite.com/myModel">
    <c>my value</c>
  </b>
</a>
Run Code Online (Sandbox Code Playgroud)

如果我想提取"a"元素的内容,则正确返回其上下文:

SELECT Extract(myColumn, '/a') FROM myTable;
Run Code Online (Sandbox Code Playgroud)

但是为了返回"c"元素的内容,我没有成功找到任何版本.以下说明不起作用:

SELECT Extract(myColumn, '/a/b/c') FROM myTable;

SELECT Extract(myColumn, '/a/b/c', 'xmlns="urn:www.someSite.com/myModel"') FROM myTable;

SELECT Extract(myColumn, '/a/b/c', 'urn:www.someSite.com/myModel') FROM myTable;
Run Code Online (Sandbox Code Playgroud)

任何人都能帮助我,使用在这种情况下可行的提取语句吗?

xml oracle namespaces extract

2
推荐指数
1
解决办法
1万
查看次数

标签 统计

oracle ×2

extract ×1

namespaces ×1

plsql ×1

xml ×1

xmltable ×1

xquery ×1