xml - Oracle Xml 生成节点 null

标签 xml oracle

我的程序

SELECT dbms_xmlgen.getxml('select * from '||i_tablename) into xml_data from dual;

doc := DBMS_XMLDOM.NewDOMDocument(xml_data);

DBMS_XMLDOM.WRITETOFILE(doc, 'XML_DIR/'||v_tablename);

我的 table

ID Name SAL HIREDATE DEPTNO E_MAIL
1 xyz 23 01-JAN-00 2 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f7959b96b7959b96d994989a" rel="noreferrer noopener nofollow">[email protected]</a>
2 - - - 23 - - - - - - - - - - <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3d5c4e597d5f515c5f515c135e5250" rel="noreferrer noopener nofollow">[email protected]</a>

xml输出

<?xml version="1.0" ?>
<ROWSET>
<ROW>
<ID>1</ID>
<NAME>xyz</NAME>
<SAL>23</SAL>
<HIREDATE>01-JAN-00</HIREDATE>
<DEPTNO>2</DEPTNO>
<E_MAIL><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dbb9b7ba9bb9b7baf5b8b4b6" rel="noreferrer noopener nofollow">[email protected]</a></E_MAIL>
</ROW>
<ROW>
<ID>1</ID>
<SAL>23</SAL>
<E_MAIL><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c5a7a9a485a7a9a4eba6aaa8" rel="noreferrer noopener nofollow">[email protected]</a></E_MAIL>
</ROW>
</ROWSET>

我想做

<?xml version="1.0" ?>
<ROWSET>
<ROW>
<ID>1</ID>
<NAME>xyz</NAME>
<SAL>23</SAL>
<HIREDATE>01-JAN-00</HIREDATE>
<DEPTNO>2</DEPTNO>
<E_MAIL><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ed8f818cad8f818cc38e8280" rel="noreferrer noopener nofollow">[email protected]</a></E_MAIL>
<ROW>
<ID>2</ID>
<NAME></NAME>
<SAL>23</SAL>
<HIREDATE></HIREDATE>
<DEPTNO></DEPTNO>
<E_MAIL><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8beaf8efcbe9e7eae9e7eaa5e8e4e6" rel="noreferrer noopener nofollow">[email protected]</a></E_MAIL>
</ROW>
</ROWSET>

最佳答案

我们可以使用DBMS_XMLGEN.SETNULLHANDLING()来控制XQuery处理NULL的方式。将其设置为 2 会生成一个空标签。不幸的是,操作结果集的格式需要我们指定上下文,因此会导致语法稍微冗长。

SQL> set long 5000
SQL> var c clob
SQL>
SQL> declare
  2      ctx dbms_xmlgen.ctxhandle;
  3  begin
  4      ctx := dbms_xmlgen.newcontext('select * from emp where deptno = 10');
  5      -- set EMPTY_TAG  flag
  6      dbms_xmlgen.SETNULLHANDLING (ctx, 2);
  7      :c := dbms_xmlgen.getxml(ctx);
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL>
SQL> print c

C
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <EMPNO>7782</EMPNO>
  <ENAME>BOEHMER</ENAME>
  <JOB>MANAGER</JOB>
  <MGR>7839</MGR>
  <HIREDATE>09-JUN-81</HIREDATE>
  <SAL>2450</SAL>
  <COMM/>
  <DEPTNO>10</DEPTNO>
  <LEAVE_DATE/>
 </ROW>
 <ROW>
  <EMPNO>7839</EMPNO>
  <ENAME>SCHNEIDER</ENAME>
  <JOB>PRESIDENT</JOB>
  <MGR/>
  <HIREDATE>17-NOV-81</HIREDATE>
  <SAL>5000</SAL>
  <COMM/>
  <DEPTNO>10</DEPTNO>
  <LEAVE_DATE/>
 </ROW>
 <ROW>
  <EMPNO>8070</EMPNO>
  <ENAME>DUGGAN</ENAME>
  <JOB>SALES</JOB>
  <MGR>7782</MGR>
  <HIREDATE>19-NOV-09</HIREDATE>
  <SAL>2500</SAL>
  <COMM/>
  <DEPTNO>10</DEPTNO>
  <LEAVE_DATE/>
 </ROW>
</ROWSET>


SQL>

关于xml - Oracle Xml 生成节点 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2220269/

相关文章:

xml - EventLog XML查询过滤器日期范围

xml - 来自/dev/random 的随机文本在 lxml : All strings must be XML compatible: Unicode or ASCII, 中引发错误,没有 NULL 字节

xml - 使用 MOXy 避免循环,@XmlInverseReference @XmlID

oracle - ORA-00902 : invalid datatype

SQL:如果没有找到记录,则返回 0 计数

java - 查找 InitialContext.lookup 检索的数据源在哪里定义?

java - 将 xml 转换为 hashmap,反之亦然

mysql - 从 oracle 到 mySQL

oracle - ORA-01450 : maximum key length exceeded after SET max_string_size=extended

c++ - 使用 libxml2 的 XML 解析结果重复