使用PLPGSQL插入XML节点

时间:2017-02-23 15:20:14

标签: xml plpgsql xml.modify

我正在使用PLPGSQL来处理名为XMLland的XML列。 我有一个填充了土地信息的专栏,我无法改变,但我可以添加。

作为循环的一部分,我知道它是功能性的,由于其他语句,我希望插入一些额外的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'

我收到错误     语法错误在或附近&#34;(&#34; SET oidetails.modify(&#39;

这是一个语法问题,还是不可能在PLPGSQL中使用.modify()

非常感谢

1 个答案:

答案 0 :(得分:0)

完全错误 - 你不能用UPDATE语句修改XML文档的某些部分 - 这个语句可以用来修改某些表的某些列值。

UPDATE table SET field WHERE constrains 

PostgreSQL中的XML文档是不可变的 - 这意味着,您不能编辑文档,您必须创建新的更改文档,旧文档应该被新文档替换。更多 - PostgreSQL中的XML文档是+/-字符串 - 您可以像字符串一样修改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的任何相关功能。