sql >> Database teknologi >  >> RDS >> Oracle

Bryder Oracles EXTRACT-funktion NOENTITYESCAPING i XMLELEMENT?

Prøv at bruge extractvalue() funktion, som frigør kodede enheder i stedet for extract() . Her er et eksempel:

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)

Resultat:

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

Men brugen af ​​extractvalue() funktion kan være begrænset af det faktum, at den kan returnere værdien af ​​kun én node. I tilfælde af at returnere værdier af flere noder, er utl_i18n pakke og unescape_reference() funktionen af ​​denne pakke kan bruges til at unescape kodede entiteter:

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;

Resultat:

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

Ja, som utl_i18n.unescape_reference() Funktionen accepterer kun værdier af varchar2 datatype og typer, der implicit kan konverteres til varchar2 datatype, er dine hænder bundet, når det kommer til at behandle store "strenge ". I denne situation kan du henvende dig til dbms_xmlgen pakke og konverter() funktion især, som har en overbelastet version, der er i stand til at acceptere CLOB s. Her er et eksempel:

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  

Resultat:

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



  1. Ydeevnemyter:Tabelvariabler er altid i hukommelsen

  2. Sådan eksporteres kun tekst, der kan udskrives (eller enhver anden pakkeegenskab) i wireshark

  3. MYSQL vælger alle poster, hvor brugernavn og datopar forekommer mere end én gang

  4. Har et varchar-felts deklarerede størrelse nogen indflydelse i PostgreSQL?