2013-03-29 13 views

回答

6

你可以”使用XMLFOREST

如果value_expr为null,则该value_expr创建任何元素。

,也不是类似XMLCOLATTVAL功能:

您必须指定value_expr值。如果value_expr为null,则不返回任何元素。

XMLELEMENT另一方面返回一个空元件的要求:

SQL> select xmlelement("EMP", xmlelement("ENAME", ename), 
    2       xmlelement("JOB", job), 
    3       xmlelement("MGR", mgr) 
    4  ).getclobval() xml 
    5 from scott.emp; 

XML 
---------------------------------------------------------------- 
<EMP><ENAME>KING</ENAME><JOB>PRESIDENT</JOB><MGR></MGR></EMP> 
<EMP><ENAME>BLAKE</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR></EMP> 
... 

为了完整起见,两个Oracle工具还可以用于(通过this post on the OTN forums启发)。首先,你可以使用XMLQUERY(上11.2?):

SQL> select 
    2 xmlquery(
    3  '(#ora:view_on_null empty #) { 
    4  <EMPS> { 
    5   for $c in fn:collection("oradb:/SCOTT/EMP")/ROW 
    6   return element EMP { 
    7   $c/ENAME 
    8   , $c/JOB 
    9   , $c/MGR 
10  } 
11  }</EMPS> 
12  }' 
13 passing cast(10 as number) as "mid" 
14 returning content 
15 ).getClobval() as result 
16 from dual; 

RESULT 
---------------------------------------------------------------------- 
<EMPS> 
    <EMP><ENAME>KING</ENAME><JOB>PRESIDENT</JOB><MGR></MGR></EMP> 
    <EMP><ENAME>BLAKE</ENAME>... 

您还可以使用DBMS_XMLGEN包:

SQL> DECLARE 
    2 ctx dbms_xmlgen.ctxHandle; 
    3 sqlstr varchar2(4000) 
    4  := 'SELECT ename, job, mgr FROM scott.emp WHERE ename=''KING'''; 
    5 res clob; 
    6 BEGIN 
    7 ctx := dbms_xmlgen.newContext(sqlstr); 
    8 dbms_xmlgen.setNullHandling(ctx, dbms_xmlgen.EMPTY_TAG); 
    9 res := dbms_xmlgen.getXML(ctx); 
10 dbms_xmlgen.closeContext(ctx); 
11 dbms_output.put_line(res); 
12 END; 
13/

<?xml version="1.0"?> 
<ROWSET> 
<ROW> 
    <ENAME>KING</ENAME> 
    <JOB>PRESIDENT</JOB> 
    <MGR/> 
</ROW> 
</ROWSET> 
相关问题