sql >> Databáze >  >> RDS >> Oracle

Porušuje funkce EXTRACT společnosti Oracle NOENTITYESCAPING v XMLELEMENT?

Zkuste použít extractvalue() funkce, která ruší kódované entity namísto extract() . Zde je příklad:

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)

Výsledek:

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

Ale použití extractvalue() Funkce může být omezena tím, že může vrátit hodnotu pouze jednoho uzlu. V případě vrácení hodnot více uzlů utl_i18n balíček a unescape_reference() funkci tohoto balíčku lze použít k odstranění kódovaných entit:

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;

Výsledek:

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

Ano, jako utl_i18n.unescape_reference() funkce přijímá pouze hodnoty varchar2 datový typ a typy, které lze implicitně převést na varchar2 datového typu, máte svázané ruce, pokud jde o zpracování velkých „řetězců ". V této situaci se můžete obrátit na dbms_xmlgen balíček a convert() zejména funkce, která má přetíženou verzi schopnou přijmout CLOB s. Zde je příklad:

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  

Výsledek:

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



  1. Jak získat a zobrazit největší hodnoty z databáze?

  2. Jak přidat kódování xml <?xml verze=1.0 kódování=UTF-8?> do výstupu xml na serveru SQL

  3. Zkontrolujte, zda je ipv6 v dosahu

  4. Pout více sloupců na základě jednoho sloupce v SQL Server