Вставка узлов XML с использованием PLPGSQL

Я использую PLPGSQL для обработки столбца XML под названием XMLland. У меня есть колонка с информацией о земле, которую я не могу изменить, но могу добавить.

В рамках цикла, который, как мне известно, функционирует, из-за других операторов я ищу возможность вставки некоторых дополнительных узлов XML. Однако я не знаком с конкретными функциями PLPGSQL. Я использую REC, чтобы перебрать таблицу.

Пример текущего XML

<area>
    <type>
        mixed
    </type>
    <population>
        10,000
    </population>
</area>

Я ищу, чтобы вставить новый узел в

<tree>
    <height>
        20m
    </height>
    <density>
        6
    </density>
</tree>

Вот заявление об обновлении, которое я использую

UPDATE "dbLand".tbl_duration
SET XMLland.modify('
insert <tree><height>rec.height</height><density>rec.density</density>    </tree> as first
into (/area)[1]')
WHERE referee = 'abc'

Я получаю ошибку синтаксиса ошибки в или около "(" SET oidetails.modify('

Это проблема синтаксиса, или невозможно использовать.modify() в PLPGSQL

Помощь очень ценится

1 ответ

Это совершенно неправильно - вы не можете изменять некоторые части XML-документа с помощью UPDATE оператор - этот оператор может использоваться для изменения некоторого значения столбца некоторой таблицы.

UPDATE table SET field WHERE constrains 

XML-документы в PostgreSQL являются неизменяемыми - это означает, что вы не можете редактировать документ, вы должны создать новый измененный документ и старый документ должен быть заменен новым документом. Более того - XML-документ в PostgreSQL представляет собой +/- строку - вы можете изменить XML как строку.

postgres=# SELECT * FROM data;
┌───────────────────┐
│         d         │
╞═══════════════════╡
│ <area>           ↵│
│     <type>       ↵│
│         mixed    ↵│
│     </type>      ↵│
│     <population> ↵│
│         10,000   ↵│
│     </population>↵│
│ </area>           │
└───────────────────┘
(1 row)

postgres=# UPDATE data SET d = replace(d::text, '</area>', 
'    <height>
       20m
    </height>
    <density>
       6
    </density>
 </area>')::xml;
UPDATE 1

postgres=# SELECT d FROM data;
┌───────────────────┐
│         d         │
╞═══════════════════╡
│ <area>           ↵│
│     <type>       ↵│
│         mixed    ↵│
│     </type>      ↵│
│     <population> ↵│
│         10,000   ↵│
│     </population>↵│
│     <height>     ↵│
│         20m      ↵│
│     </height>    ↵│
│     <density>    ↵│
│         6        ↵│
│     </density>   ↵│
│ </area>           │
└───────────────────┘
(1 row)

PostgreSQL не имеет специальных функций для каких-либо обновлений функций XML. Если вам это нужно, то вы можете установить plv8 - движок javascript для хранимых функций, и вы можете использовать любую связанную функциональность javascript.

Другие вопросы по тегам