XMLFOREST
オラクル関数を使用したいと思います。(定義へのリンク)
構文例:
XMLFOREST( [value expression AS alias], [...])
私の問題は、値式が NULL の場合、その値式に対して要素が作成されないことです。
空の XML フラグメントを追加するにはどうすればよいですか?
使用できます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>
...
完全を期すために、さらに 2 つの Oracle ツールを使用することもできます ( OTN フォーラムのこの投稿に触発されています)。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>