Вставка узлов 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.