#sql #xml #oracle #parsing #plsql
#sql #xml #Oracle #синтаксический анализ #plsql
Вопрос:
Я вызываю службу Soap в plsql и получаю ответ в формате xml. я хочу проанализировать xml и хочу сохранить одно значение в таблице Oracle. Ниже вывод xml :
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="3c08103b-65da-4f34-95e7-ec2c90ba5b74">00000000-0000-0000-0000-000000000000</ActivityId>
<o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
<u:Timestamp u:Id="_0">
<u:Created>2019-04-16T20:21:06.467Z</u:Created>
<u:Expires>2019-04-16T20:26:06.467Z</u:Expires>
</u:Timestamp>
</o:Security>
</s:Header>
<s:Body>
<SaveSalesResponse xmlns="https://unifree.com.tr/services/custom">
<SaveSalesResult xmlns:a="http://schemas.datacontract.org/2004/07/CustomServiceLibrary.DataContract" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Result>true</a:Result>
<a:Provision>
<a:ProvisionNo>245982</a:ProvisionNo>
</a:Provision>
</SaveSalesResult>
</SaveSalesResponse>
</s:Body>
</s:Envelope>
Я хочу сохранить <a:ProvisionNo>245982</a:ProvisionNo>
это число в таблице
Пожалуйста, предложите простой способ сохранить значение в таблице
Комментарии:
1. Спасибо Сами. Всегда ли в документе будет только один <a:ProvisionNo> или их будет несколько?
Ответ №1:
Исходя из предпосылки, что приведенный вами пример документа является репрезентативным для используемого макета документа (что существует только один <s:Body>
, только с <SaveSalesResponse>
одним и т. Д. Для <a:PorivisionNo>
каждого документа, EXTRACTVALUE
Это все, что должно потребоваться.
Если ваш набор данных включает более сложные структуры, содержащие несколько <a:ProvisionNo>
для каждого документа, я бы рекомендовал вместо этого извлекать значения с XMLQUERY
помощью / XMLTABLE
.
Ниже приведен пример загрузки таблицы с <a:ProvisionNo>
помощью via EXTRACTVALUE
.
CREATE TABLE PROVISION_NO(THE_PROVISION_NO INTEGER);
Table created.
Затем запустите загрузку:
INSERT INTO PROVISION_NO(THE_PROVISION_NO)
SELECT EXTRACTVALUE( XMLTYPE('<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="3c08103b-65da-4f34-95e7-ec2c90ba5b74">00000000-0000-0000-0000-000000000000</ActivityId>
<o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
<u:Timestamp u:Id="_0">
<u:Created>2019-04-16T20:21:06.467Z</u:Created>
<u:Expires>2019-04-16T20:26:06.467Z</u:Expires>
</u:Timestamp>
</o:Security>
</s:Header>
<s:Body>
<SaveSalesResponse xmlns="https://unifree.com.tr/services/custom">
<SaveSalesResult xmlns:a="http://schemas.datacontract.org/2004/07/CustomServiceLibrary.DataContract" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Result>true</a:Result>
<a:Provision>
<a:ProvisionNo>245982</a:ProvisionNo>
</a:Provision>
</SaveSalesResult>
</SaveSalesResponse>
</s:Body>
</s:Envelope>'),
'/s:Envelope/s:Body/*:SaveSalesResponse/*:SaveSalesResult/a:Provision/a:ProvisionNo',
'xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://schemas.datacontract.org/2004/07/CustomServiceLibrary.DataContract" ')
FROM DUAL;
1 row created.
И результат:
SELECT THE_PROVISION_NO FROM PROVISION_NO;
THE_PROVISION_NO
___________________
245982
1 row selected.