Чтобы упростить задачу, я сначала импортировал бы XML в промежуточную таблицу:
CREATE TABLE xml_import
(
xml_data xml
)
Затем, заполнив промежуточную таблицу, вы можете извлечь из нее данные с помощью оператора SQL, преобразовав XML в реляционное представление:
with product_list as (
select unnest(xpath('/soap12:Envelope/soap12:Body/pl:GetProductListResponse/pl:GetProductListResult/pl:ProductList/pl:Product', xml_data,
ARRAY[ array['xsd', 'http://www.w3.org/2001/XMLSchema-instance'],
array['soap12', 'http://www.w3.org/2003/05/soapenvelope'],
array['pl', 'http://xxx.yy.zz/']])) as product
from xml_import
)
select (xpath('/Product/SupplierCode/text()', product)::varchar[])[1] as suppliercode,
(xpath('/Product/SegmentId/text()', product)::varchar[])[1] as segmentid,
(xpath('/Product/PartNumber/text()', product)::varchar[])[1] as partnumber,
to_number((xpath('/Product/Price/text()', product)::varchar[])[1], '99999.99999') as price,
to_number((xpath('/Product/GrossWeight/text()', product)::varchar[])[1], '9999.9999') as weight
from product_list
Я не удосужился включить все столбцы, но я думаю, вы поняли картину.
Я бы поместил вышеупомянутое утверждение в представление, а затем вы можете просто использовать представление для заполнения таблицы вашего реального продукта.
Если вы не хотите создавать эту промежуточную таблицу, вы, вероятно, можете поместить все в один оператор:
with xml_import (xml_data) as (
select '.... xml goes here '::xml
),
product_list as (
... same as above ...
)
select ... same as above ...
from product_list