从 Oracle 中包含命名空间的 XMLTYPE 中提取标签值

问题描述 投票:0回答:3

我在 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处获取值,即成功。 我尝试使用 EXTRACTVALUE 关键字来获取值,但似乎不起作用。

任何有关 SELECT 查询获取节点值的帮助将不胜感激。 短暂性脑缺血发作。

oracle xmltype extract-value
3个回答
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 成功 abcd 0000 成功

db<>小提琴


0
投票

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

选择提取值(表名.列名, 'SOAP-ENV:信封/SOAP-ENV:正文/ProcessReply/通知/严重性', 'xmlns:SOAP-ENV =“http://schemas.xmlsoap.org/soap/envelope/” xmlns="http://dummy.com/ab/xyz/g16"') INTO 变量名 FROM 表名 WHERE 条件 = 'XYZ';


0
投票

我需要读取这个oracle 19C xml,但我不能,它没有给出错误,但它没有返回值,我做错了什么? 谢谢

随着TA( 选择 ' [Registo 1 - Campo "NIF Beneficiária" - Valor "106124188" ]: O NIF não está registado como uma entidade beneficiária. 0 [Registo 1 - Campo "Codigo_Programa_Medida" - Valor "P0287-M0002" ]: O código do programa e medida não está associado à entidade concedente 508136644. 0 [Registo 1]:É obrigatório adicionar um documento communicationsente à Declaração de Responsabilidade。 0 [Registo 1 - Campo "CAE" - Valor "19100" ]: Que o CAE afeto ao registo de auxílio de minimis em apreço, é enquadravel no nation de minimis. 0 0 ' x 从双 ) 选择 x.* 从T ,XML表( XML 命名空间( “http://www.w3.org/2001/XMLSchema”为“xsd” ,“http://www.w3.org/2001/XMLSchema-instance”为“xsi” ,“http://schemas.xmlsoap.org/soap/envelope/”为“s” ,“http://schemas.datacontract.org/2004/07/SIRCAMinimis.Contract.Entities.Common”为“a” ,“http://schemas.microsoft.com/2003/10/Serialization/Arrays”为“b” ,“http://www.w3.org/2001/XMLSchema-instance”为“i” ,“http://tempuri.org/”为“ns0” ) , '/s:信封' 传递 xmlparse(文档 t.x) 列键 varchar2(2000) 路径 's:Body/ns0:RegistarAuxilioResponse/a:RegistarAuxilioResult/a:Errors[a:KeyVal]/a:KeyVal/a:Key' ) X ;

© www.soinside.com 2019 - 2024. All rights reserved.