我想写一个sql查询来获取soap xml中两个标签之间的数据,这些标签出现在oracle表的clob列中
Posted
技术标签:
【中文标题】我想写一个sql查询来获取soap xml中两个标签之间的数据,这些标签出现在oracle表的clob列中【英文标题】:i want write a sql query to fetch data between two tags in soap xml which present in the clob column of a oracle table 【发布时间】:2021-11-15 16:59:45 【问题描述】:xml which is present ina clob column of xml_message table :
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:oag="http://gateway.consumerhub.commercial.volvocars.net/oagis" xmlns:oag1="http://www.openapplications.org/oagis" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<oag:UpdateConsumerAndOpportunityData_v1 xmlns:ns3="http://www.ford.com/oagis">
<oag1:ApplicationArea>
<oag1:Sender>
<oag1:LogicalId>Volvo</oag1:LogicalId>
<oag1:Component>Vista</oag1:Component>
<oag1:Task>SyncConsumer</oag1:Task>
<oag1:AuthorizationId>AUTH-SK034</oag1:AuthorizationId>
</oag1:Sender>
<oag1:CreationDateTime>2016-01-27T15:07:47Z</oag1:CreationDateTime>
<oag1:BODId>sk-connect-034</oag1:BODId>
</oag1:ApplicationArea>
<oag:DataArea>
<oag1:Sync confirm="Always">
<oag1:SyncCriteria expressionLanguage="XPath">
<oag1:SyncExpression action="change"/>
</oag1:SyncCriteria>
</oag1:Sync>
<oag:Consumer>
<oag:Header>
<oag:Source>AU</oag:Source>
</oag:Header>
<oag:ConsumerDetails Category="Person">
<oag:ConsumerId/>
<oag:Language>EN</oag:Language>
<oag:PersonDetails>
<oag:FirstName>firstname_email_034</oag:FirstName>
<oag:Surname>sname_email_034</oag:Surname>
</oag:PersonDetails>
<oag:EmailAddress Active="true">ticc888@yahoo.com</oag:EmailAddress>
<oag:EmailAddress Active="true" Usage="Business">ahng2@hotmail.com</oag:EmailAddress>
<oag:EmailAddress Active="true" Usage="Invoice">jsmith@gmail.com</oag:EmailAddress>
</oag:ConsumerDetails>
</oag:Consumer>
</oag:DataArea>
</oag:UpdateConsumerAndOpportunityData_v1>
</soapenv:Body>
</soapenv:Envelope>
现在我希望这个 xml 中的所有电子邮件地址都可以获取并插入到另一个表中。 这个 xml 包含 3 个电子邮件地址,我想要直到 n 个电子邮件地址被提取,一个 xml 文件将包含
【问题讨论】:
这能回答你的问题吗? Select Data out of XML from a column in ORACLE database 【参考方案1】:如链接答案所示,您可以使用 XMLTable 提取多个值;但您至少需要定义您使用的名称空间,并正确构建 XPath。因此,只需获取您可以执行的电子邮件地址:
select x.emailaddress
from xml_message m
cross apply xmltable (
xmlnamespaces (
'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
'http://gateway.consumerhub.commercial.volvocars.net/oagis' as "oag",
'http://www.openapplications.org/oagis' as "oag1",
'http://www.ford.com/oagis' as "ns3"
),
'soapenv:Envelope/soapenv:Body/oag:UpdateConsumerAndOpportunityData_v1/oag:DataArea/oag:Consumer/oag:ConsumerDetails/oag:EmailAddress'
passing xmltype(m.xml_clob)
columns
EmailAddress varchar2(64) path '.'
) x;
EMAILADDRESS |
---|
ticc888@yahoo.com |
ahng2@hotmail.com |
jsmith@gmail.com |
XPath 没有引用 oag1 或 ns3,但无论如何包含它们并没有什么坏处,您可能需要它们从同一个 XML 文档中提取其他信息。
这还可以让您一次提取多个值;或基于属性进行过滤 - 例如,您可能只想包含属性 Active 设置为 true 的电子邮件地址,您可以通过将该条件添加到 XPath 来实现:
'soapenv:Envelope/soapenv:Body/oag:UpdateConsumerAndOpportunityData_v1/oag:DataArea/oag:Consumer/oag:ConsumerDetails/oag:EmailAddress[@Active="true"]'
db<>fiddle
您可以阅读有关操作 XML 的更多信息in the documentation。
【讨论】:
太棒了。这对我有用。非常感谢 如果我也想在同一个 xml 中获取联系人号码,该怎么办:以上是关于我想写一个sql查询来获取soap xml中两个标签之间的数据,这些标签出现在oracle表的clob列中的主要内容,如果未能解决你的问题,请参考以下文章
SQL 日期函数问题;我想写一个查询语句,是查表中日期字段后十天的数据