Oracle
 sql >> Base de données >  >> RDS >> Oracle

La fonction EXTRACT d'Oracle casse-t-elle NOENTITYESCAPING dans XMLELEMENT ?

Essayez d'utiliser extractvalue() fonction, qui déséchappe les entités encodées, au lieu de extract() . Voici un exemple :

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)

Résultat :

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

Mais l'utilisation de extractvalue() La fonction peut être limitée par le fait qu'elle ne peut renvoyer la valeur que d'un seul nœud. Dans le cas du retour de valeurs de plusieurs nœuds, le utl_i18n package et unescape_reference() La fonction de ce package peut être utilisée pour démasquer les entités encodées :

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;

Résultat :

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

Oui, comme utl_i18n.unescape_reference() la fonction n'accepte que les valeurs de varchar2 type de données et types pouvant être implicitement convertis en varchar2 type de données, vos mains sont liées lorsqu'il s'agit de traiter de grandes "chaînes ". Dans cette situation, vous pouvez vous tourner vers dbms_xmlgen package et convert() fonction en particulier, qui a une version surchargée capable d'accepter CLOB s. Voici un exemple :

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  

Résultat :

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