xmltable如何处理空列

zzzyeukh  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(359)

嗨,我需要从一个有一个xml列的表中提取数据。对于某些记录,xml列没有任何数据。当我使用下面的查询时,我得到了一个错误。
我们需要运行这个查询,不管这个表在xml列中是否有数据。

CREATE TABLE XMLTAB_1 (A_ID NUMBER NOT NULL
                   , ID VARCHAR2(50) 
                   , A_DATE DATE 
                   , O_ID NUMBER 
                   , XML_KEY CLOB);

INSERT INTO  XMLTAB_1 (A_ID, ID, A_DATE ,O_ID)
VALUES (11,'SA-AND-11-12345',sysdate,null);
INSERT INTO  XMLTAB_1 (A_ID, ID, A_DATE ,O_ID,XML_KEY )
VALUES (12,'SA-AND-12-12345',sysdate,null,'<?xml version ="1.0" encoding ="UTF-16" standalone="n'"?><al><al_cd><comments><columns><time>2020-07-07 08:45:08 </time><auth>xzy</auth><a_status>new</a_status><assgn>katy</assgn><text>new record </text></columns><columns><time>2020-07-07 09:45:08 </time><auth>abcd</auth><a_status>in progress</a_status><assgn>katy_1</assgn><text>work in progress </text></columns></comments></al_cd></al>');
COMMIT;
SELECT A_ID
       , ID
       , A_DATE
       , O_ID
       , TO_DATE(C_time,'YYYY_MM_DD HH24:MI:SS') ctime
       , auth
       , status
       , assgn 
       , cmmnt  
       , RANK() OVER (PARTITION BY A_ID ORDER BY TO_DATE(C_time,'YYYY_MM_DD HH24:MI:SS') DESC) rnk
FROM XMLTAB_1 a
     , XMLTABLE('al/al_cd/comments/columns'
           PASSING XMLTYPE(a.XML_KEY) COLUMNS
                c_time   VARCHAR2(100) PATH 'time'
                , auth   VARCHAR2(100) PATH 'auth'
                , status VARCHAR2(100) PATH 'a_status'
                , assgn  VARCHAR2(100) PATH 'assgn'
                , cmmnt  VARCHAR2(100) PATH 'text') xt

我得到了错误的记录a\u id为11/12它工作正常。
ora-06502:pl/sql:数字或值错误ora:-06512 :在“sys.xmltype”第272行
谁能让我知道如何实现这一点,并删除代码中的错误。

3npbholx

3npbholx1#

假设您不只是想在 where 子句中使用case表达式 passing 条款:

...
XMLTABLE('al/al_cd/comments/columns'
   PASSING CASE WHEN a.XML_KEY IS NULL THEN NULL ELSE XMLTYPE(a.XML_KEY) END
   COLUMNS c_time VARCHAR2(100) PATH 'time',
...

xpath看起来很奇怪,可能应该是'/al/al\u cd/comments/columns',尽管它可以与其中任何一个一起使用。
db<>在@vboka's上进行小提琴演奏。我已经将旧式的交叉连接改为外部应用程序,以显示具有空值的行,这需要oracle12c+。
如果您使用的是早期版本,并且可以使用带有always true条件的外部连接,这有点像黑客。db<>小提琴;或者用你的样本数据,给出:

A_ID | ID              | A_DATE    | O_ID | CTIME     | AUTH | STATUS      | ASSGN  | CMMNT             | RNK
---: | :-------------- | :-------- | ---: | :-------- | :--- | :---------- | :----- | :---------------- | --:
  11 | SA-AND-11-12345 | 15-JUL-20 | null | null      | null | null        | null   | null              |   1
  12 | SA-AND-12-12345 | 15-JUL-20 | null | 07-JUL-20 | abcd | in progress | katy_1 | work in progress  |   1
  12 | SA-AND-12-12345 | 15-JUL-20 | null | 07-JUL-20 | xzy  | new         | katy   | new record        |   2

相关问题