1

我正在使用 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'

我在 "(" SET oidetails.modify('

这是语法问题,还是无法在 PLPGSQL 中使用 .modify()

非常感谢帮助

4

1 回答 1

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 的任何相关功能。

于 2017-02-25T06:25:33.370 回答