ORACLE,XMLAGG(arg),空arg

时间:2018-12-12 11:10:03

标签: xml oracle plsql

我有一个查询:

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:如果没有MAP或ORDER方法,则不能对对象进行ORDER。

有什么想法吗? 谢谢:)

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

1 个答案:

答案 0 :(得分: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>

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