尝试在PL/SQL中创建XML文件视图时收到错误消息ORA-19279:XPTY0004。有两个同名的XML标记

尝试在PL/SQL中创建XML文件视图时收到错误消息ORA-19279:XPTY0004。有两个同名的XML标记,sql,oracle,xml-namespaces,xmltype,xmltable,Sql,Oracle,Xml Namespaces,Xmltype,Xmltable,下面是一条XML消息: <Message xmlns="http://test.org"> <Request Promotion="MULANN"> <ExpireDate>23/10/2020 07:10</ExpireDate> <Entries> <Entry> <Product

下面是一条XML消息:

<Message xmlns="http://test.org">
    <Request Promotion="MULANN">
        <ExpireDate>23/10/2020 07:10</ExpireDate>
        <Entries>
            <Entry>
                <Product>
                    <Product Product="T1" />
                </Product>
                <Payment>
                    <Privacy>N</Privacy>
                </Payment>
            </Entry>
            <Entry>
                <Product>
                    <Product Product="T2" />
                </Product>
                <Payment>
                    <Privacy>N</Privacy>
                </Payment>
            </Entry>
            <Entry>
                <Product>
                    <Product Product="T3" />
                </Product>
                <Payment>
                    <Privacy>Y</Privacy>
                </Payment>
            </Entry>            
        </Entries>
    </Request>
</Message>
我想得到这样的东西:

Promotion     Privacy
MULANN           N
MULANN           Y

问题是XML有多个嵌套级别。 您可以通过链接XMLTABLEs来解决这个问题

如果嵌套子对象中并非所有信息都始终可用,则外部联接将有所帮助

SELECT DISTINCT
       promotion,
       privacy
  FROM TableName,
       XMLTABLE( XMLNAMESPACES( DEFAULT 'http://test.org'),
       '/Message' PASSING XMLTYPE(xml_info)
       COLUMNS promotion   VARCHAR2(20)   PATH 'Request/@Promotion',
               entries     XMLTYPE        PATH 'Request/Entries/Entry'
       ) x1
 LEFT OUTER JOIN (
       XMLTABLE( XMLNAMESPACES( DEFAULT 'http://test.org'),
       '/Entry' PASSING x1.entries
       COLUMNS privacy     VARCHAR2(1)    PATH 'Payment/Privacy'
       )) x2
       ON 1=1;
SELECT DISTINCT
       promotion,
       privacy
  FROM TableName,
       XMLTABLE( XMLNAMESPACES( DEFAULT 'http://test.org'),
       '/Message' PASSING XMLTYPE(xml_info)
       COLUMNS promotion   VARCHAR2(20)   PATH 'Request/@Promotion',
               entries     XMLTYPE        PATH 'Request/Entries/Entry'
       ) x1
 LEFT OUTER JOIN (
       XMLTABLE( XMLNAMESPACES( DEFAULT 'http://test.org'),
       '/Entry' PASSING x1.entries
       COLUMNS privacy     VARCHAR2(1)    PATH 'Payment/Privacy'
       )) x2
       ON 1=1;