sql >> Database >  >> RDS >> Oracle

Breekt de EXTRACT-functie van Oracle de NOENTITYESCAPING in het XMLELEMENT?

Probeer extractvalue() . te gebruiken functie, die gecodeerde entiteiten ongedaan maakt, in plaats van extract() . Hier is een voorbeeld:

clear screen;
column res format a20;

-- depending on a situation, NOENTITYESCAPING might be dropped

select extractvalue(
                     xmlelement(NOENTITYESCAPING e,id,'->')
                    , '//text()'
                    ) as res
  from (select level as id 
          from dual 
       connect by level < 6)

Resultaat:

RES                
--------------------
1->                  
2->                  
3->                  
4->                  
5->    

Maar het gebruik van extractvalue() functie kan worden beperkt door het feit dat het de waarde van slechts één knooppunt kan retourneren. In het geval van het retourneren van waarden van meerdere knooppunten de utl_i18n pakket, en unescape_reference() functie van dat pakket kan worden gebruikt om gecodeerde entiteiten te ontsluiten:

clear screen;
column res format a20;

select utl_i18n.unescape_reference(xmlelement(root
                                             , xmlelement(node1, '>')
                                             , xmlelement(node2, '<')
                                             ).extract('//text()').getstringval()
                                   ) as res
 from dual
connect by level <= 3;

Resultaat:

RES                
--------------------
><                   
><                   
>< 

Ja, als utl_i18n.unescape_reference() functie accepteert alleen waarden van varchar2 gegevenstype en typen die impliciet kunnen worden geconverteerd naar de varchar2 gegevenstype, uw handen zijn gebonden als het gaat om het verwerken van grote "strings ". In deze situatie kunt u zich wenden tot dbms_xmlgen pakket en convert() functie in het bijzonder, die een overbelaste versie heeft die CLOB . kan accepteren s. Hier is een voorbeeld:

select dbms_xmlgen.convert(
                           xmlagg(xmlelement(root
                                             , xmlelement(node1, '>')
                                             , xmlelement(node2, '<')
                                             )
                                  ).extract('//text()').getclobval()
                          , 1) as res
 from dual
connect by level <= 3000;   -- 1 (second parameter of the convert() function)
                            -- instructs function to decode entities  

Resultaat:

RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB



  1. Voortdurend willekeurige audio streamen uit de database

  2. Tijdelijk databaseontwerp, met een twist (live vs conceptrijen)

  3. K-d tree indexeren?

  4. Datum invoegen in Oracle-database vanuit PHP