从 ORACLE 中的 CLOB 字段中解析 Xml 个节点值

Parse Xml node values from CLOB field in ORACLE

我正在尝试从 CLOB 字段解析 XML 节点值,它抛出无效令牌错误: XML:

create table traptabclob(testclob clob);
insert into traptabclob values('<?xml version="1.0" encoding="UTF-8"?>
<tns:InputOutputScoringDetails xmlns:tns="jdhajdjh"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="dasd.xsd ">
     <tns:InputsOutputs>
               <tns:NameValue>                                                            
                   <tns:Name>ABSC_APPLICANTBUREAUSCORE</tns:Name>
                   <tns:Value>0.11030000000000001</tns:Value>
               </tns:NameValue>
               <tns:NameValue>
                    <tns:Name>ABS_BN_SCORE_DETAIL_PK</tns:Name>
                    <tns:Value>10035</tns:Value>
               </tns:NameValue>
      </tns:InputsOutputs>
</tns:InputOutputScoringDetails>
                               ');

SQL 查询:

SELECT EXTRACTVALUE(xmltype(testclob), '/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name')
FROM traptabclob;

任何人都可以帮助我如何使用 xmltype 和 extractvalue 来提取名称或值节点的值?

谢谢

无效标记是 tns: 命名空间前缀。您需要提供 tns 命名空间信息作为查询的一部分:

SELECT EXTRACTVALUE(
    xmltype(testclob),
    '/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name',
    'xmlns:tns="jdhajdjh"'
  ) AS result
FROM traptabclob;

尽管 extractvalue 已被弃用很长时间,因此您可以改用 XMLQuery:

SELECT XMLQuery(
    'declare namespace tns="jdhajdjh";
    /tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name/text()'
    PASSING xmltype(testclob)
    RETURNING CONTENT
  ) AS result
FROM traptabclob;

两者都得到:

RESULT
-------------------------
ABSC_APPLICANTBUREAUSCORE

根据您的操作,您可能会发现使用 XMLTable 更方便:

SELECT x.name, x.value
FROM traptabclob t
CROSS APPLY XMLTable(
  XMLNamespaces ('jdhajdjh' AS "tns"),
  '/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue'
  PASSING xmltype(testclob)
  COLUMNS
    name VARCHAR2(30) PATH 'tns:Name',
    value NUMBER PATH 'tns:Value'
) x;

得到:

NAME                                          VALUE
------------------------------ --------------------
ABSC_APPLICANTBUREAUSCORE        .11030000000000001
ABS_BN_SCORE_DETAIL_PK                        10035

db<>fiddle