回答

收藏

即使表达式值为null,如何执行xmlforest creat元素?

技术问答 技术问答 282 人阅读 | 0 人回复 | 2023-09-14

我想使用oracleXMLFOREST函数。(定义链接)" P& L$ ]( v0 A: K. ?7 h2 G
语法示例:
4 p7 b1 J6 Y$ s2 z0 @( p* N0 Q/ P2 q
XMLFOREST( [value expression AS alias], [...])9 H. U) M1 H9 v3 o; l

; o1 J) _# f# ]8 [+ u我的问题是,如果值表达式为NULL,则不会为该值表达式创建任何元素。4 y3 r! ~+ T' Z7 ]
如何执行它以添加一个空的XML片段?
& F" J( X$ r+ e& {" A) G3 G. l                ' Z% v" |2 e3 ]: l1 g% B
解决方案:
# H5 Q( r; w8 c8 j9 A9 D               
4 r1 x2 d& m& j4 a! \& H- f6 d3 ?

: O0 @$ E0 @# u1 z9 K' J1 ~                您可以使用XMLFOREST:# `3 m2 J! Q% |5 u. a. ~0 Z$ X
! a, ]3 m& w) Y0 `6 K" l6 x
如果value_expr为null,则不会为该value_expr创建任何元素。
& e$ q! U, _* [6 U" _: q8 h8 z3 l2 E* C( m1 ?" _. {* T
也没有类似的XMLCOLATTVAL功能:- |8 ?' P, v) E. M( J; f  ]- N

9 J$ h& u/ |! n0 ?; j9 l4 U# r您必须为value_expr指定一个值。如果value_expr为null,则不返回任何元素。) f' ?9 }$ O( z  A. S
8 i  _: `) q! O
XMLELEMENT' O* i( C5 E) z( G
另一方面,按要求返回一个空元素:" D% T. ]: E! f7 h. o8 B- L7 l' W. Z
SQL> select xmlelement("EMP", xmlelement("ENAME", ename),
0 q& Z) F5 x% F  2                           xmlelement("JOB", job),4 V$ h$ z( A2 e1 B$ |3 o
  3                           xmlelement("MGR", mgr)
4 F. V& K+ ~% r) V2 a8 z/ T* t  4         ).getclobval() xml: m# i. J+ F8 y1 g' n' S$ Q
  5    from scott.emp;
; S  ]* a! ^6 A/ IXML3 h( k' _* b' T  o9 N5 e4 Y9 B2 E! w
----------------------------------------------------------------4 v! N1 H( a+ Q5 @+ s
KINGPRESIDENT
3 `' u+ _' Y! ]! K. q2 D9 `. y  l- C2 XBLAKEMANAGER78391 h7 e- Z! ]1 i9 I* y
...+ {3 Z' K2 m' E: k% f0 B2 }0 b
7 y, X- F2 q1 w  d, e
为了完整起见,还可以使用另外两个Oracle工具(受OTN论坛上的这篇文章启发)。首先,您可以使用XMLQUERY(在11.2上?):) \0 ]. B3 h: ^8 o% g& [' M% c
SQL> select/ H5 [: j% n5 g1 y" I% g/ g& R9 e
  2    xmlquery(2 O+ N* Q; X1 W6 ]4 b
  3     '(#ora:view_on_null empty #) {
3 c8 ~4 D; @/ i) d  k  ~6 Z  4       {# Y7 F# s$ K4 k
  5          for $c in fn:collection("oradb:/SCOTT/EMP")/ROW+ J- N$ O' P* k2 `; `$ K
  6          return element EMP {% n# u  R$ i4 k4 A, O9 b- O
  7            $c/ENAME
3 ^1 F5 R. x" ?$ u/ B  8          , $c/JOB
- ~" X4 z" n, N  9          , $c/MGR, g  u  j' X7 [+ T' x  O- [5 @* Z
10       }
0 C7 l, N2 V7 e0 u5 a 11      }2 f: O) {2 I# z: V
12     }'
$ O2 ~0 ^; _# S 13    passing cast(10 as number) as "mid"
% R! @* h6 T4 }, t' P5 e 14    returning content
: |* j) q' p! v 15  ).getClobval() as result. h2 D7 m" ?5 y+ P% V
16  from dual;' P5 v/ R) w' E5 `
RESULT
/ t- ~6 M4 [/ t, ?/ M----------------------------------------------------------------------
+ o* n& x, M" p* t' [   KINGPRESIDENT
- L9 l- e) r7 \- ^; R3 |   BLAKE...
. Y# |% ^9 v( D- `! @您还可以使用该DBMS_XMLGEN软件包:5 A% r. }; X+ h
SQL> DECLARE
6 G" f9 K& A4 p- @- L9 g  2    ctx    dbms_xmlgen.ctxHandle;( w: z1 w& ?. N  k
  3    sqlstr varchar2(4000)
5 a- M+ w  m: J- ~2 h; r  4       := 'SELECT ename, job, mgr FROM scott.emp WHERE ename=''KING''';
0 |0 Q3 _' S$ \9 r9 u) O% m  5    res    clob;9 F, B9 d: _) u2 J! e
  6  BEGIN, P* [% S1 Z, s& U
  7    ctx := dbms_xmlgen.newContext(sqlstr);
. V4 S$ m" n5 f6 o! W  8    dbms_xmlgen.setNullHandling(ctx, dbms_xmlgen.EMPTY_TAG);
0 N' s! U' |8 q" v1 Y4 B( u  9    res := dbms_xmlgen.getXML(ctx);
, L- \8 H4 t, ~7 i2 y! ` 10    dbms_xmlgen.closeContext(ctx);# {% I: R( `! z
11    dbms_output.put_line(res);
( ~3 ]2 @1 ~. W; ]( m 12  END;/ ^0 h% }( I6 y
13  /
+ a% X7 \1 g0 @# O* [# `. m9 `- L: w8 f

! K8 k. N4 U4 P/ j! p9 ^& [  KING! A) I  D: g2 ^! w
  PRESIDENT
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则