Обновление XML-элемента в Oracle с помощью соединения с другими таблицами

#sql #xml #oracle

#sql #xml #Oracle

Вопрос:

У меня есть XML, хранящийся в столбце XMLTYPE, который содержит зашифрованные элементы, которые мне нужно заменить расшифрованным значением путем соединения с другими таблицами.

 -- Sample XML
<Root_Element xmlns="http://euroconsumers.org/notifications/2019/01/notification">    
    <DocID>ABCD1234</DocID>
    <InsertDate>2019-03-01</InsertDate>
    <TimeSeries>
        <Received_DocID>123456</Received_DocID>
        <Encrypted_ProviderID>PROV001</Encrypted_ProviderID>
        <Point>
            <Encrypted_BidID>BD001</Encrypted_BidID>
            <Amount>1.63</Amount>
        </Point>
    </TimeSeries>
    <TimeSeries>
        <Received_DocID>123456</Received_DocID>
        <Encrypted_ProviderID>PROV001</Encrypted_ProviderID>
        <Point>
            <Encrypted_BidID>BD002</Encrypted_BidID>
            <Amount>1.63</Amount>
        </Point>
    </TimeSeries>
    <TimeSeries>
        <Received_DocID>987654</Received_DocID>
        <Encrypted_ProviderID>PROV002</Encrypted_ProviderID>
        <Point>
            <Encrypted_BidID>BD101</Encrypted_BidID>
            <Amount>1.85</Amount>
        </Point>
    </TimeSeries>
</Root_Element>

-- PROVIDERS table

ProviderID Encrypted_ProviderID
PROVEU     PROV001
PROVUK     PROV002

-- BIDS table

Received_DocID BidID Encrypted_BidID
123456         1111  BD001
123456         2222  BD002
987654         3333  BD101


-- Expected output
<Root_Element xmlns="http://euroconsumers.org/notifications/2019/01/notification">    
    <DocID>ABCD1234</DocID>
    <InsertDate>2019-03-01</InsertDate>
    <TimeSeries>
        <Received_DocID>123456</Received_DocID>
        <Encrypted_ProviderID>PROVEU</Encrypted_ProviderID>
        <Point>
            <Encrypted_BidID>111</Encrypted_BidID>
            <Amount>1.63</Amount>
        </Point>
    </TimeSeries>
    <TimeSeries>
        <Received_DocID>123456</Received_DocID>
        <Encrypted_ProviderID>PROVEU</Encrypted_ProviderID>
        <Point>
            <Encrypted_BidID>2222</Encrypted_BidID>
            <Amount>1.63</Amount>
        </Point>
    </TimeSeries>
    <TimeSeries>
        <Received_DocID>987654</Received_DocID>
        <Encrypted_ProviderID>PROVUK</Encrypted_ProviderID>
        <Point>
            <Encrypted_BidID>3333</Encrypted_BidID>
            <Amount>1.85</Amount>
        </Point>
    </TimeSeries>
</Root_Element>
  

Тег будет повторяться в XML около 1000 раз, поэтому обновление должно быть быстрым и, по возможности, в одной инструкции.

Есть ли простой и быстрый способ сделать это с помощью XMLQuery?

База данных — Oracle 11.2.0.3

Комментарии:

1. XML допускает только один корневой тег. При объединении файлов вы получите массив на корневом уровне. Вы могли бы добавить новый root в файл следующим образом: <new_root><Root_Element></Root_Element><Root_Element></Root_Element><Root_Element></Root_Element><Root_Element></Root_Element></new_root > Итак, все, что вам нужно сделать, это создать новый файл с помощью <new_root>, затем добавить 1000 файлов, а затем завершить с помощью </new_root>

2. Извините, если я не прояснил вопрос. Существует только один XML, и мне нужно обновить зашифрованные элементы в нем и сгенерировать новый XML-файл. Значения, подлежащие расшифровке, хранятся в таблицах Oracle, поэтому каким-то образом мне нужно объединить XML с таблицами Oracle с помощью Xquery.