sql >> Databasteknik >  >> RDS >> Oracle

Bryter Oracles EXTRACT-funktion NOENTITYESCAPING i XMLELEMENT?

Försök att använda extractvalue() funktion, som tar bort kodade entiteter, istället för extract() . Här är ett exempel:

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 användningen av extractvalue() funktion kan begränsas av det faktum att den kan returnera värdet på endast en nod. I fallet med att returnera värden för flera noder är utl_i18n paket och unescape_reference() funktionen för det paketet kan användas för att unescape kodade 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 accepterar endast värden för varchar2 datatyp och typer som implicit kan konverteras till varchar2 datatyp, dina händer är knutna när det gäller att bearbeta stora "strängar ". I den här situationen kan du vända dig till dbms_xmlgen paket och konvertera() funktion i synnerhet, som har en överbelastad version som kan acceptera CLOB s. Här är ett exempel:

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. sammanfogning av två bord med flera villkor i skenor

  2. SQL - behåll ordning baserat på frågeparametrarna

  3. MySQL - Hur sammanfogar man två tabeller utan dubbletter?

  4. PostgreSQL tvingar standard SQL-syntax