Oracle11g 如何删除XMLAGG()输出中的额外字符

Oracle11g 如何删除XMLAGG()输出中的额外字符,oracle11g,Oracle11g,Im使用Oracle Database 11g Enterprise Edition 11.2.0.4.0版-64位生产 我们将listag()替换为XMLAGG(),以避免连接错误。 当我从两个函数输出中检查字符的长度时,XMLAGG()会给出一个额外的字符长度。 你能建议我如何克服这个问题吗 请找到下面的sql并输出 XMLAGG(): 输出: STR_CONCATE STR_LENGTH TEST_LOAD TEST_LOAD

Im使用Oracle Database 11g Enterprise Edition 11.2.0.4.0版-64位生产

我们将listag()替换为XMLAGG(),以避免连接错误。 当我从两个函数输出中检查字符的长度时,XMLAGG()会给出一个额外的字符长度。 你能建议我如何克服这个问题吗

请找到下面的sql并输出

XMLAGG():

输出:

STR_CONCATE                  STR_LENGTH

TEST_LOAD  TEST_LOAD              26
STR_CONCATE                  STR_LENGTH

TEST_LOAD TEST_LOAD               25
LISTAGG()

输出:

STR_CONCATE                  STR_LENGTH

TEST_LOAD  TEST_LOAD              26
STR_CONCATE                  STR_LENGTH

TEST_LOAD TEST_LOAD               25
  • xmlement
    的情况下,您实际上创建了包含两个子节点的XML树节点:
    table\u name
    CHR(13)
    。(可能它最终看起来像一个节点,因为两者都是文本,但并不重要。)它是。实质性的问题是节点不知道其他节点,
    CHR(13)
    被添加到每个节点作为其后缀,或者换句话说,终止符

  • 对于
    listag
    ,您描述了多个元素的聚合。在本例中,您的
    CHR(13)
    充当放置在元素之间的对象。它是分隔符而不是终止符

由于
XMLAGG
不会受到影响,我通常更喜欢
XMLAGG
。 如果需要分隔符,我建议在每个值前面加上分隔符,并使用
substr
剪切第一次出现的值。在后面加上后缀是可能的,但会使表达式更难表达

substr(
xmlagg(
xmlelement(e','| | table_name).extract('//text()'))
按表空间\u名称排序
).getclobval(),
2.
)

用其他字符替换CHR(13)并运行查询。您将看到,在XMLAGG中,该字符被追加在末尾,而在LISTAGG中则不是。我在Listag()中也有相同的CHR(13),但它不会产生任何问题。我假设@EatÅPeach建议用另一个(可见)字符替换CHR(13),以显示XMLAGG在每个表名称后添加了此分隔符(即使在最后一个之后)是的,我删除了CHR(13)并用“,”进行了检查,然后我使用rtrim(…..,”)删除了最后一个。其中,as samething不与chr(13)一起工作:(