ORACLE,XMLAGG(arg),空 arg

Posted

技术标签:

【中文标题】ORACLE,XMLAGG(arg),空 arg【英文标题】:ORACLE, XMLAGG(arg), null arg 【发布时间】:2018-12-12 11:10:03 【问题描述】:

我有一个问题:

SELECT  xmlelement("Response",
            xmlelement("hist",
              xmlelement("details",
                xmlagg(x.node)))
          ) AS XML_HIST,
          x.cnt
 FROM     (
            SELECT  null AS node,
                    COUNT(1) OVER() AS cnt
            FROM    dual
            --WHERE 1=2
         ) x
  GROUP BY x.cnt

查询 x 是针对这个问题(敏感数据)进行的。

当查询 x 返回任何数据时,一切都很好。但是当表中没有记录时(这里:WHERE 1=2),我在包中的代码失败并出现错误 no_data_found。

我正在尝试寻找与

不同的灵魂
<<inner_block>>
begin
SELECT..
exception
when others then...
end inner_block;

我试图做类似的事情

SELECT  MAX(xmlelement("docGetPackageHistoryResponse",
            xmlelement("histories",
              xmlelement("contract-history",
                xmlagg(x.node)))
          )) AS XML_HIST,
    MAX(cnt)

但我收到错误 ORA-22950: cannot ORDER objects without MAP or ORDER method.

有什么想法吗? 谢谢:)

请不要问我“为什么要避免内部块解决方案?”之类的问题。

【问题讨论】:

【参考方案1】:

错误来自于将聚合 max() 应用于 XMLElement,这实际上没有任何意义;如果没有它,它的行为仍然与您的原始查询相同。

我认为您只是在错误的点上进行了汇总;你可以这样做:

SELECT xmlelement("Response",
         xmlelement("hist",
           xmlelement("details",
             (
               SELECT xmlagg(x.node)
               FROM (
                 SELECT null AS node,
                        COUNT(1) OVER() AS cnt
                 FROM   dual
                 WHERE 1=2
               ) x
               GROUP BY x.cnt
             )
           )
         )
       ) AS XML_HIST
FROM dual
/

XML_HIST                                                                        
--------------------------------------------------------------------------------
<Response><hist><details></details></hist></Response>

您无法在结果集中将内部计数视为单独的列,但看起来您并不真正需要它。

【讨论】:

以上是关于ORACLE,XMLAGG(arg),空 arg的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 多个 XMLAgg

如何使用 Oracle 11g 中的 XMLAGG 函数序列化树数据而不是重复的 XML 标记,嵌套结构?

oracle行转列,列转行函数的使用(listagg,xmlagg)

使用 xmlagg 函数的 SQL 多 SELECT 查询 - 未以所需方式提取数据

Argo 项目加入 CNCF 孵化器 | 云原生生态周报 Vol. 45

将“LISTAGG”转换为“XMLAGG”