Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Unterbricht die EXTRACT-Funktion von Oracle das NOENTITYESCAPING im XMLELEMENT?

Versuchen Sie, extractvalue() zu verwenden anstelle von extract() . Hier ist ein Beispiel:

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)

Ergebnis:

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

Aber die Verwendung von extractvalue() Die Funktion kann durch die Tatsache eingeschränkt sein, dass sie nur den Wert eines Knotens zurückgeben kann. Im Fall der Rückgabe von Werten mehrerer Knoten wird utl_i18n Paket und unescape_reference() Funktion dieses Pakets kann verwendet werden, um verschlüsselte Entitäten aufzuheben:

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;

Ergebnis:

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

Ja, als utl_i18n.unescape_reference() Die Funktion akzeptiert nur Werte von varchar2 Datentyp und Typen, die implizit in varchar2 konvertiert werden können Datentyp sind Ihnen die Hände gebunden, wenn es um die Verarbeitung großer "Strings geht ". In dieser Situation können Sie sich an dbms_xmlgen wenden Paket und convert() Funktion, die eine überladene Version hat, die CLOB akzeptieren kann s. Hier ist ein Beispiel:

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  

Ergebnis:

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