簡體   English   中英

解析字段形式 xml clob

[英]Parse field form xml clob

再見,

我對 sql 有一個問題。 我有一些數據類型為 clob 的表,其中存儲了一個 clob。 在同一張表中,如果我們有 xml 格式,我們使用一個 function 來獲取 xml_fied

CREATE OR REPLACE FUNCTION gettagvalue (
XMLBody IN CLOB, TagXml IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
 return TO_CHAR (SUBSTR (XMLBody,
                        INSTR (XMLBody, '<'||TagXml||'>') + length(TagXml) + 2,
                          INSTR (XMLBody, '</'||TagXml||'>')
                        - INSTR (XMLBody, '<'||TagXml||'>')
                        - (length(TagXml) + 2)
                       )
               );
END GetTagValue;
/

例子:

Select errorhandler.GetTagValue(xml_content,'ORDERID')
from table_order

在同一張桌子上,我們在 json 中也有一些 xml。

我如何創建相同 function 的副本以進行實地考察? 在 xml 上很容易,因為我們有以 json 開頭和結尾的同名字段

我無法理解如何定義字段的結尾

不要嘗試將 XML 或 JSON 解析為字符串; 使用正確的 XML 或 JSON 解析器。

如果您有包含示例數據的表:

CREATE TABLE table_name (
  xml CLOB,
  json CLOB CHECK ( json IS JSON )
);

INSERT INTO table_name ( xml, json ) VALUES (
  '<a><b>BBB</b><c>CCC</c><d>DDD</d></a>',
  '{"a":"aaa","b":"bbb","c":[1,2,3,4],"d":"ddd"}'
);

然后,您可以使用XMLQUERYJSON_QUERY函數從兩者中獲取c值:

SELECT XMLQUERY(
          '*/c/text()'
          PASSING XMLTYPE(xml)
          RETURNING CONTENT
       ) AS c_xml_value,
       JSON_QUERY(
         json,
         '$.c'
         RETURNING VARCHAR2(50)
       ) AS c_json_value
FROM   table_name

哪個輸出:

 | C_XML_VALUE | C_JSON_VALUE | |:---------- |:----------- | | CCC | [1,2,3,4] |

如果您在同一列中有 XML 和 JSON 值,則查看第一個字符是否為<並使用適當的解析 function; 不要嘗試創建自己的 function 來解析使用 substring 匹配的值。

例如:

CREATE TABLE table_name ( value CLOB );

INSERT INTO table_name ( value )
SELECT '<a><b>BBB</b><c>CCC</c><d>DDD</d></a>' FROM DUAL UNION ALL
SELECT '{"a":"aaa","b":"bbb","c":[1,2,3,4],"d":"ddd"}' FROM DUAL;

然后:

SELECT CASE
       WHEN value LIKE '<%'
       THEN CAST(
              XMLQUERY( '*/c/text()' PASSING XMLTYPE(value) RETURNING CONTENT )
              AS VARCHAR2(50)
            )
       ELSE JSON_QUERY( value, '$.c' RETURNING VARCHAR2(50) )
       END AS c_value
FROM   table_name

輸出:

 | C_VALUE | |:-------- | | CCC | | [1,2,3,4] |

db<> 在這里擺弄

更新

您還可以使用JSON_TABLEXMLTABLE來獲取所有值:

SELECT COALESCE( j.sourceChannel, x.sourceChannel ) AS sourceChannel,
       COALESCE( j.transactionId, x.transactionId ) AS transactionId,
       COALESCE( j.sessionId, x.sessionId ) AS transactionId,
       COALESCE( j.status, x.status ) AS status,
       COALESCE( j.errorcode, x.errorcode ) AS errorcode,
       COALESCE( j.errordescription, x.errordescription ) AS errordescription
FROM   table_name t
       OUTER APPLY JSON_TABLE(
         t.value,
         '$.header'
         COLUMNS (
           sourceChannel    VARCHAR2( 50) PATH '$.sourceChannel',
           transactionId    VARCHAR2( 50) PATH '$.transactionId',
           sessionId        VARCHAR2( 50) PATH '$.sessionId',
           status           VARCHAR2( 50) PATH '$.status',
           errorcode        VARCHAR2( 50) PATH '$.errorcode',
           errordescription VARCHAR2(200) PATH '$.errordescription'
         )
       ) j
       LEFT OUTER JOIN LATERAL(
         SELECT *
         FROM   XMLTABLE(
                  '/header'
                  PASSING XMLTYPE( value )
                  COLUMNS
                    sourceChannel    VARCHAR2( 50) PATH 'sourceChannel',
                    transactionId    VARCHAR2( 50) PATH 'transactionId',
                    sessionId        VARCHAR2( 50) PATH 'sessionId',
                    status           VARCHAR2( 50) PATH 'status',
                    errorcode        VARCHAR2( 50) PATH 'errorcode',
                    errordescription VARCHAR2(200) PATH 'errordescription'
                )
       ) x
       ON ( t.value LIKE '<%' )

對於樣本數據:

CREATE TABLE table_name ( value CLOB );

INSERT INTO table_name ( value )
SELECT '<header>
  <sourceChannel>xaaa</sourceChannel>
  <transactionId>xbbb</transactionId>
  <sessionId>xccc</sessionId>
  <status>xddd</status>
  <errorcode>xeee</errorcode>
  <errordescription>xfff</errordescription>
</header>' FROM DUAL UNION ALL
SELECT '{"header":{"sourceChannel":"jaaa","transactionId":"jbbb","sessionId":"jccc","status":"jddd","errorcode":"jeee","errordescription":"jfff"}}' FROM DUAL;

輸出:

來源渠道 交易ID 交易ID 地位 錯誤代碼 錯誤描述
呸呸呸 xbbb xccc xddd 嘻嘻 xfff
賈阿 jbbb jccc 京東 傑夫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM