Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hàm EXTRACT của Oracle có phá vỡ hàm NOENTITYESCAPING trong XMLELEMENT không?

Cố gắng sử dụng extractvalue() hàm, không thoát khỏi các thực thể được mã hóa, thay vì extract() . Đây là một ví dụ:

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)

Kết quả:

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

Nhưng việc sử dụng extractvalue() chức năng có thể bị giới hạn bởi thực tế là nó chỉ có thể trả về giá trị của một nút. Trong trường hợp trả về giá trị của nhiều nút, utl_i18n gói và unescape_reference() chức năng của gói đó có thể được sử dụng cho các thực thể được mã hóa unescape:

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;

Kết quả:

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

Có, như utl_i18n.unescape_reference() hàm chỉ chấp nhận các giá trị của varchar2 kiểu dữ liệu và các kiểu có thể được chuyển đổi hoàn toàn thành varchar2 loại dữ liệu, tay của bạn bị ràng buộc khi xử lý " chuỗi lớn" ". Trong trường hợp này, bạn có thể chuyển sang dbms_xmlgen gói và chuyển đổi () cụ thể là hàm có phiên bản quá tải có khả năng chấp nhận CLOB S. Đây là một ví dụ:

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  

Kết quả:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trả về 'bảng' (không xác định trước tên cột) từ một hàm PL / SQL

  2. Làm cách nào để thay đổi NLS_DATE_FORMAT trong PHP

  3. tên bảng động trong con trỏ

  4. Làm cách nào để sử dụng ngày hiện tại trong truy vấn HQL với cơ sở dữ liệu Oracle?

  5. Tại sao một biến oracle plsql varchar2 cần một kích thước nhưng một tham số thì không?