Oracle 多个 XMLAgg

Posted

技术标签:

【中文标题】Oracle 多个 XMLAgg【英文标题】:Oracle multiple XMLAgg 【发布时间】:2014-11-26 14:20:26 【问题描述】:

我正在使用 Oracle 10g 构建一个 sql 查询, 并希望获得以下 xml 格式的 sql 输出:

<Users>
        <User>
            <USRID>1234</USRID>
            <USERNAME>ABCD</USERNAME>
            <ROLES>
                <ROLE>
                    <ROLEID>1</ROLEID>
                    <ROLENAME>GlobalAdministrator</ROLENAME>
                    <ISDEFAULTROLE>1</ISDEFAULTROLE>
                </ROLE>
                <ROLE>
                    <ROLEID>2</ROLEID>
                    <ROLENAME>Administrator</ROLENAME>
                    <ISDEFAULTROLE>0</ISDEFAULTROLE>
                </ROLE>
            </ROLES>
        </User>
        <User>
            <USRID>2312</USRID>
            <USERNAME>XUX</USERNAME>
            <ROLES>
                <ROLE>
                    <ROLEID>3</ROLEID>
                    <ROLENAME>AccountManager</ROLENAME>
                    <ISDEFAULTROLE>1</ISDEFAULTROLE>
                </ROLE>
                <ROLE>
                    <ROLEID>5</ROLEID>
                    <ROLENAME>Approver</ROLENAME>
                    <ISDEFAULTROLE>0</ISDEFAULTROLE>
                </ROLE>
            </ROLES>
        </User>
    </Users>

我刚刚构建的Sql:

SELECT XMLElement("Users", 
  XMLAgg(XMLElement("User",
    XMLElement("USRID",u.USRID) ,
    XMLElement("USERNAME",u.USERNAME) ,
    XMLElement("Roles",
      SELECT xmlagg(XMLElement("Role",
        XMLElement("ROLEID",ur.ROLEID),
        XMLElement("ROLENAME",r.NAME),
        xmlelement("ISDEFAULTROLE",ur.PRIMARY))
          FROM USERROLE ur,role r WHERE u.USRID = ur.USRID AND r.ROLEID  = ur.ROLEID))))).getClobVal()
FROM usr u

但它给出以下错误: ORA-00936: 缺少表达式 00936. 00000 - “缺少表达式” *原因: *行动: 行错误:26 列:1

我该怎么做?

【问题讨论】:

【参考方案1】:

我想通了:

SELECT XMLElement("Users",            
XMLAgg(XMLElement("User"                        
,XMLElement("USRID",u.USRID)                    
,XMLElement("USERNAME",u.USERNAME)
,xmlElement("Roles",
                 (
                   select xmlAgg(xmlElement("Role"
,XMLElement("ROLEID",ur.ROLEID)
,XMLElement("ROLENAME",r.NAME)
,xmlelement("ISDEFAULTROLE",ur.PRIMARY)))
from USERROLE ur,role r where u.USRID = ur.USRID and r.ROLEID = ur.ROLEID)
)))).getClobVal()
from usr u 

【讨论】:

以上是关于Oracle 多个 XMLAgg的主要内容,如果未能解决你的问题,请参考以下文章

oracle 如何在一个数据库创建多个实例

oracle 多个 update语句怎么写

在 oracle 中一次捕获多个异常

oracle 怎么给字段增加多个条件

oracle update set 多个字段

oracle里面怎么多个字段分组排序