Puede usar dbms_xmlgen con dbms_xmlgen.setNullHandling(qryCtx, dbms_xmlgen.EMPTY_TAG) o dbms_xmlgen.NULL_ATTR:
Por ejemplo, cree su propia función
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;
/
entonces puedes usarlo en consultas:
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>
Como puede ver, el segundo parámetro de esta función es null_handling:
- NÚMERO CONSTANTE DROP_NULLS:=0; Omite la etiqueta para elementos NULL.
- NÚMERO CONSTANTE NULL_ATTR:=1; (Predeterminado) Establece xsi:nil="true".
- NÚMERO CONSTANTE ETIQUETA_VACÍA:=2; Conjuntos, por ejemplo, .
O incluso puede alinear su función en la consulta:
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
/
Resultado con NULL_ATTR predeterminado:
XXX
-----------------------------------------------------------------
<ROWSET xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
<ROW>
<X xsi:nil = "true"/>
</ROW>
</ROWSET>
Resultado con EMPTY_TAG predeterminado:
select
f_get_xmltype_with_nulls(cursor(select null as x from dual),2) as xxx
from dual;
XXX
-------------------------------------
<ROWSET>
<ROW>
<X/>
</ROW>
</ROWSET>