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 11g 中的 XMLAGG 函数序列化树数据而不是重复的 XML 标记,嵌套结构?
oracle行转列,列转行函数的使用(listagg,xmlagg)
使用 xmlagg 函数的 SQL 多 SELECT 查询 - 未以所需方式提取数据