0

我在 Oracle 18c 上,并且有一个列为 XMLTYPE 的表,其中包含如下值:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <ProcessReply xmlns="http://dummy.com/ab/xyz/g16">
            <HighestSeverity>PASS</HighestSeverity>
            <Notifications>
                <Severity>SUCCESS</Severity>
                <Source>abcd</Source>
                <Code>0000</Code>
                <Message>Success</Message>
            </Notifications>
        </ProcessReply>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我有一个存储过程,我试图在节点Severity处获取值,即 SUCCESS。我尝试使用 EXTRACTVALUE 关键字来获取值,但它似乎不起作用。

任何有关 SELECT 查询以获取节点值的帮助将不胜感激。TIA。

4

2 回答 2

1

extractvalue()功能已弃用,并且已经存在很长时间了;您应该改用 XMLQuery:

SELECT XMLQuery ('
    declare namespace SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
    declare default element namespace "http://dummy.com/ab/xyz/g16";
    /SOAP-ENV:Envelope/SOAP-ENV:Body/ProcessReply/Notifications/Severity/text()'
  passing table_name.column_name
  returning content).getstringval()
INTO variable_name
FROM table_name
WHERE condition = 'XYZ';

db<>小提琴

如果您需要来自同一个 XML 文档的多个值,那么请查看 XMLTable;例如:

SELECT table_name.condition, x.severity, x.source, x.code, x.message
FROM table_name
CROSS APPLY xmltable (
  xmlnamespaces(
    default 'http://dummy.com/ab/xyz/g16',
    'http://schemas.xmlsoap.org/soap/envelope/' as "SOAP-ENV"
  ),
  '/SOAP-ENV:Envelope/SOAP-ENV:Body/ProcessReply/Notifications'
  passing table_name.column_name
  columns
    severity varchar2(10) path 'Severity',
    source varchar2(10) path 'Source',
    code varchar2(4) path 'Code',
    message varchar2(50) path 'Message'
) x
WHERE condition = 'XYZ';

得到

健康)状况 严重性 资源 代码 信息
XYZ 成功 A B C D 0000 成功

db<>小提琴

于 2021-07-05T11:14:46.043 回答
0

好的,通过一些尝试和试验找到了解决方案。挑战在于我的 XML 有多个命名空间,这些命名空间可以作为第三个参数提供给带有空格分隔的提取值。所以这个查询对我有用:

SELECT EXTRACTVALUE (table_name.column_name, 'SOAP-ENV:Envelope/SOAP-ENV:Body/ProcessReply/Notifications/Severity', 'xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://dummy.com/ab/xyz/g16"') INTO variable_name FROM table_name WHERE condition = 'XYZ';

于 2021-07-05T10:14:23.557 回答