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

XMLType in oracle không tạo thẻ cho các cột có giá trị Null

Bạn có thể sử dụng dbms_xmlgen với dbms_xmlgen.setNullHandling (qryCtx, dbms_xmlgen.EMPTY_TAG) hoặc dbms_xmlgen.NULL_ATTR:

Ví dụ:tạo hàm riêng

create or replace function f_get_xmltype_with_nulls (cur sys_refcursor, null_handling int default dbms_xmlgen.null_attr)
  return xmltype
as
  /* null_handling may be: 
      DROP_NULLS CONSTANT NUMBER:= 0;  Leaves out the tag for NULL elements.
      NULL_ATTR CONSTANT NUMBER:= 1; (Default) Sets xsi:nil="true".
      EMPTY_TAG CONSTANT NUMBER:= 2; Sets, for example, <foo/>.
  */
  res xmltype;
  lc dbms_xmlgen.ctxhandle;
begin
  lc:=dbms_xmlgen.newcontext(cur);
  -- you can replace null_attr with empty_tag here:
  dbms_xmlgen.setnullhandling(lc, null_handling);
  res:=dbms_xmlgen.getxmltype(lc);
  return res;
end;
/

thì bạn có thể sử dụng nó trong các truy vấn:

SQL> select f_get_xmltype_with_nulls(cursor(select null x from dual connect by level<10)) x from dual;

X
------------------------------------------------------------------------
<ROWSET xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
</ROWSET>

Như bạn có thể thấy tham số thứ hai của hàm này là null_handling:

  • DROP_NULLS CONSTANT NUMBER:=0; Bỏ qua thẻ cho các phần tử NULL.
  • NULL_ATTR CONSTANT NUMBER:=1; (Mặc định) Đặt xsi:nil ="true".
  • EMPTY_TAG CONSTANT NUMBER:=2; Ví dụ:bộ.

Hoặc bạn thậm chí có thể nội dòng hàm của mình vào truy vấn:

with 
   function f_get_xmltype_with_nulls (cur sys_refcursor, null_handling int default dbms_xmlgen.null_attr)
     return xmltype
   as
     /* null_handling may be: 
         DROP_NULLS CONSTANT NUMBER:= 0;  Leaves out the tag for NULL elements.
         NULL_ATTR CONSTANT NUMBER:= 1; (Default) Sets xsi:nil="true".
         EMPTY_TAG CONSTANT NUMBER:= 2; Sets, for example, <foo/>.
     */
     res xmltype;
     lc dbms_xmlgen.ctxhandle;
   begin
     lc:=dbms_xmlgen.newcontext(cur);
     -- you can replace null_attr with empty_tag here:
     dbms_xmlgen.setnullhandling(lc, null_handling);
     res:=dbms_xmlgen.getxmltype(lc);
     return res;
   end;
select
   f_get_xmltype_with_nulls(cursor(select null as x from dual)) as xxx 
from dual
/

Kết quả với NULL_ATTR mặc định:

XXX
-----------------------------------------------------------------
<ROWSET xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
 <ROW>
  <X xsi:nil = "true"/>
 </ROW>
</ROWSET>

Kết quả với EMPTY_TAG mặc định:

select
   f_get_xmltype_with_nulls(cursor(select null as x from dual),2) as xxx 
from dual;

XXX
-------------------------------------
<ROWSET>
 <ROW>
  <X/>
 </ROW>
</ROWSET>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao chép ORACLE_HOME

  2. ORA-01735:tùy chọn ALTER TABLE không hợp lệ - Con cóc

  3. Oracle SQL để sắp xếp số phiên bản

  4. Độ trễ của Oracle giữa cam kết và chọn

  5. Làm cách nào để giới hạn số hàng được trả về bởi một truy vấn Oracle sau khi đặt hàng?