如何在Oracle中仅为指定版本的XML类型列插入Translation节点?
解决Oracle SQL Developer中XML更新仅针对特定版本的问题
你的XML更新逻辑本身是正确的,问题出在WHERE子句没有限定要更新的具体版本——当前条件只筛选了关联书籍为《Encore une fois》的所有版本,所以两个Edition行都被修改了。要实现只更新第二个版本(ID=18、年份2001、价格150的那一行),只需要在WHERE条件里添加版本的唯一标识即可。
方案1:通过版本ID精准定位(最直接)
如果已知目标版本的ID是18,可以直接在WHERE子句中加入Edition.ID = 18:
UPDATE BOOKDB.EDITION SET Translations = XMLQUERY( 'copy $res := $t modify insert node element Translation { attribute Language {"Norwegian"}, attribute Publisher {"KLC"}, attribute Price {200} } as last into $res/Translations return $res' PASSING Translations AS "t" RETURNING CONTENT ) WHERE Edition.Book IN (SELECT ID FROM BOOKDB.Book WHERE Title = 'Encore une fois') AND Edition.ID = 18; -- 新增:限定目标版本ID
方案2:通过版本属性组合定位(更灵活)
如果不想硬编码版本ID,也可以用该版本的其他唯一属性(比如年份+价格)来定位:
UPDATE BOOKDB.EDITION SET Translations = XMLQUERY( 'copy $res := $t modify insert node element Translation { attribute Language {"Norwegian"}, attribute Publisher {"KLC"}, attribute Price {200} } as last into $res/Translations return $res' PASSING Translations AS "t" RETURNING CONTENT ) WHERE Edition.Book IN (SELECT ID FROM BOOKDB.Book WHERE Title = 'Encore une fois') AND Edition.Year = 2001 -- 版本2的年份 AND Edition.Price = 150; -- 版本2的价格
为什么这样有效?
原WHERE子句只筛选了关联书籍,而新增的条件会进一步缩小范围,仅匹配你想要修改的那个特定Edition行,这样XML节点的插入操作就只会作用在版本2上了。
内容的提问来源于stack exchange,提问作者Red Eyez
相关产品推荐
相关产品推荐

