使用 XMLTable 读取 XMLTYPE

reading XMLTYPE using XMLTable

好的,所以我在 PLSQL 中遇到一个问题,查询 returns 字面意思是 0 行:

select xt.CRN
 from xml_table x, XMLTable('/IE599/PotwierdzenieWywozu'
   passing x.xml_value
   columns
   CRN varchar2(100) PATH '@CRN' ) xt
   where x.id_xml=19740 

Xml 看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<IE599 xmlns="http://www.mf.gov.pl/xsd/ECS/IE599_v1-0.xsd" EmailPodmiotu="xxx@xxxxxx.com" NrWlasny="xxxxx-1674661">
    <PotwierdzenieWywozu CRN="xxxxxxx-27564" DataPrzyjecia="2018-07-31T15:20:48" DataWyprowadzenia="xxxx-24" DataZwolnienia="xxxx-07-xxxx:51:20" DokumentyAlternatywne="0" Kontenery="1" KrajPrzeznaczenia="xxxx" KrajWysylki="xxxx" LiczbaOpakowan="xxxx" LiczbaPozycji="1" MRN="xxxxxxxxxxxxxx" MasaBrutto="453.680" NrWlasny="xxxxxx-xxxxx" OdprawaScentralizowana="0" P1a="EX" P1b="A" Tranzyt="0" UCWyprowadzenia="xxxxx" UCWywozu="xxxxxxx">
        <Nadawca EORI="xxxxxx" KodPocztowy="62-045" Kraj="PL" Miejscowosc="xxxxx" Nazwa="xxxxxx SP. ZO.O" TIN="xxxxxx" UlicaNumer="UL.xxxxx xx" />
        <Odbiorca KodPocztowy="xxxxx 1M8" Kraj="CA" Miejscowosc="xxxxx ST xxxxx" Nazwa="xxxxxx xxxxx - VILLE ST-LAURENT" UlicaNumer="xxxxx xxxxx xxxxxx" />
        <ZglaszajacyPrzedstawiciel EORI="PL527020362600000" KodPocztowy="05-090" Kraj="PL" Miejscowosc="xxxxx" Nazwa="xxxxx DISTRIBUTION SERVICES" Przedstawicielstwo="3" Regon="xxxxxxxx" TIN="xxxxxxx" UlicaNumer="xxxxx xxxxxx" />
        <TransportWewnetrzny Rodzaj="3" Znaki="HLXU8495377" />
        <TransportNaGranicy Kraj="PL" Rodzaj="1" Znaki="STATEK" />
        <Lokalizacja Miejsce="xxxxxx" />
        <WarunkiDostawy Kod="xxxxx" Miejsce="xxxxxx" MiejsceKod="1" />
        <Transakcja Rodzaj="11" Wartosc="4130.00" />
        <Towar KodTaric="00" KodTowarowy="xxxxxxx" MasaNetto="453.680" Nr="1" OpisTowaru="xxxxxxxx[14szt.]" ProceduraPoprzednia="00" ProceduraWnioskowana="10">
            <Opakowanie LiczbaSztuk="14" Rodzaj="NE" />
            <Kontener Nr="xxxxxxxx" />
            <KodDodatkowyUE Kod="4099" />
            <DokumentWymagany Kod="xx" Nr="xxxxxxx" />
            <InformacjaDodatkowa Kod="30200" />
            <WartoscTowaru WartoscStatystyczna="4212.00">
                <Korekta Kod="1STW" Wartosc="82.10" />
            </WartoscTowaru>
        </Towar>
        <WynikKontroli Kod="A3" Termin="2018-10-29" />
        <MiejsceData Data="2018-07-31" Miejsce="xxxxxx xxxxxx" NazwiskoImie="xxxxxx xxxxxxx" Stanowisko="xxxxxx d/s xxxxxx" Telefon="xx xxx xx xx" />
        <WynikKontroliGr Kod="A2" />
    </PotwierdzenieWywozu>
</IE599>

所以我可能做错了什么? 我尝试了几种选择,例如添加(@ 和 / )或从 Path 中删除它,但没有任何效果如我所愿...

这个问题的解决方法是给 XMLTABLE 添加一个命名空间,所以代码:

select xt.CRN
 from xml_table x, XMLTable('/IE599/PotwierdzenieWywozu'
   passing x.xml_value
   columns
   CRN varchar2(100) PATH '@CRN' ) xt
   where x.id_xml=19740 

应该是这样的:

select xt.CRN
 from xml_table x, XMLTable('declare default element namespace "http://www.mf.gov.pl/xsd/ECS/IE599_v1-0.xsd";/IE599/PotwierdzenieWywozu'
   passing x.xml_value
   columns
   CRN varchar2(100) PATH '@CRN' ) xt
   where x.id_xml=19740