我在 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 查询获取节点值的帮助将不胜感激。 短暂性脑缺血发作。
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';
如果您需要同一 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 | 成功 |
好吧,通过一点点尝试找到了解决方案。 挑战在于我的 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';
我需要读取这个oracle 19C xml,但我不能,它没有给出错误,但它没有返回值,我做错了什么? 谢谢
随着TA(
选择 '