0

我有提交“XmlInfo”的表格。此字段是 varchar2 并包含 XML。不要问为什么是 varchar2 - 这是旧的数据库结构。

我需要在这个 xml 中“添加”一个标签。所以我使用了 xmltype.createXML 和 APPENDCHILDXML 组合。问题在于输出。

原始字段没有缩进。所以首先我使用带有“无缩进”选项的 xmlserialize。不幸的是,这仅在 oracle 11 中可用,我需要在 oracle 10 和 11 上都使用此查询。

所以我使用变换。但我又被困住了。

原值:

<info><Managed>False</Managed></info>

预期的:

<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>


我使用这个查询

select xmltype.createXML(t1.XmlInfo).APPENDCHILDXML('//info',XMLTYPE.CREATEXML('<ChangedDate>'|| to_char(sysdate, 'yyyy-mm-dd') ||'</ChangedDate>'))
  .transform(xmltype(
    '<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output omit-xml-declaration="yes" indent="no"/><xsl:template match="@*|node()"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:template></xsl:stylesheet>'
  )).getStringVal()
from table1 t1

Oracle 11 中的结果(如预期的那样):

<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>

Oracle 10 中的结果(有新行字符):

<info>
<Managed>False</Managed>
<ChangedDate>2013-09-11</ChangedDate>
</info>



这种转换有什么问题,或者有什么方法可以编写这个查询并在两个版本的 oracle 中按预期工作?

备注:在下一步我将不得不更新这个值,所以我将使用“updatexml”。这就是为什么我不能只连接两个字符串。

4

3 回答 3

0

什么问题让你缩进?无论如何,您只需将其放回 VARCHAR2 中,因此您可以使用与标签之间的 [:space:] 类匹配的简单 REGEX_REPLACE 去除缩进;就像是:

REGEXP_REPLACE(indentedxml, ">[[:space:]]+<", "><")
于 2013-10-19T23:15:10.677 回答
0

我通过完全删除 xml 引擎并使用纯文本来解决问题...
通过结合substr,instrcase语句,我创建了丑陋、晦涩的 SQL,在特定位置注入正确的日期。
取决于此节点中是否存在ChangedDate字符串和旧值。

这是解决方法,因此我将问题标记为已回答。但如果有人知道缩进问题的真正答案,请告诉我。因为仅使用字符串函数可能不那么容易处理下一次更新...

于 2013-10-20T23:07:22.200 回答
0

它不容易使用,但如果您需要生成 XML 的特定表示,XMLTransform是正确的运算符。

于 2013-10-21T09:18:27.250 回答