Sql 在oracle中构建xml而不需要不必要的标记

Sql 在oracle中构建xml而不需要不必要的标记,sql,xml,oracle,oracle11g,Sql,Xml,Oracle,Oracle11g,我想用sql在oracle中构建XML,经过一点研究,我发现了一种用sql函数构建XML的方法,我完全不知道有任何XML。我的问题是 SELECT XMLELEMENT("orderwave", XMLAGG(XMLELEMENT("order_header", -- XMLATTRIBUTES(t2.l_name AS "order_number"), XMLFORE

我想用sql在oracle中构建XML,经过一点研究,我发现了一种用sql函数构建XML的方法,我完全不知道有任何XML。我的问题是

SELECT XMLELEMENT("orderwave",
             XMLAGG(XMLELEMENT("order_header",
                         -- XMLATTRIBUTES(t2.l_name AS "order_number"),
                          XMLFOREST(
                          nvl(t2.l_name,' ') as "order_number",
                        (
                         SELECT XMLAGG(XMLELEMENT("order_line",
                                       XMLFOREST( nvl(t1.l_name,' ') AS "label_type", 
                                                  nvl(t1.l_num,0) AS "lpn",
                                                  nvl(t1.l_num,0) AS "sku"
                                                )
                                                  )
                                      )  
                          FROM test_table t1
                          WHERE UPPER(t1.record_type)='D'             
                        ) AS sap
                                  )
                                  )
                       )
                       ) AS HEADER
                       FROM test_table t2 
                       WHERE UPPER(t2.record_type) ='H';  
我的问题是使用xmlforest时,我必须在查询中使用别名“sap”才能工作并获得xml输出。如果我使用它,我会在数据周围得到一个不需要的标签“SAP”,我以后必须对其进行剪切,这是不可接受的。有没有一种方法我可以摆脱这个额外的'SAP'标签,而不必削减。输出数据为

<orderwave>
   <order_header>
      <order_number>order1</order_number>
      <SAP>
         <order_line>
            <label_type>test1</label_type>
            <lpn>1</lpn>
            <sku>1</sku>
         </order_line>
         <order_line>
            <label_type>test2</label_type>
            <lpn>2</lpn>
            <sku>2</sku>
         </order_line>
         <order_line>
            <label_type />
            <lpn>0</lpn>
            <sku>0</sku>
         </order_line>
      </SAP>
   </order_header>
   <order_header>
      <order_number>order2</order_number>
      <SAP>
         <order_line>
            <label_type>test1</label_type>
            <lpn>1</lpn>
            <sku>1</sku>
         </order_line>
         <order_line>
            <label_type>test2</label_type>
            <lpn>2</lpn>
            <sku>2</sku>
         </order_line>
         <order_line>
            <label_type />
            <lpn>0</lpn>
            <sku>0</sku>
         </order_line>
      </SAP>
   </order_header>
</orderwave>

订单1
测试1
1.
1.
测试2
2.
2.
0
0
订单2
测试1
1.
1.
测试2
2.
2.
0
0

非常感谢您的帮助。

我找到了答案

select xmlelement  
       (  
          "order_wave"  
        , xmlagg  
          (  
            xmlelement  
            (  
                "order_header"  
              , xmlelement("order_number", nvl(t1.l_name,' '))  
              , xmlagg  
                (  
                  xmlelement  
                  (  
                     "order_line"  
                   , xmlelement("label_type", nvl(t2.l_name,' '))  
                   , xmlelement("lpn", nvl(t2.l_num,0))  
                   , xmlelement("sku", nvl(t2.l_num,0))  
                  )  
                )  
            )  
          )  
       ) xml_data  
  from test_table t1, test_table t2  
 where t1.record_type = 'h'  
   and t2.record_type = 'd'
 and t1.msg_ind = t2.msg_ind  
 group  
    by t1.l_name; 

一年前我们也遇到了同样的问题,时间不够了,所以我们只是在输出文件上做了一个
sed
,以去除不需要的标记。我很想看看是否有任何oracle专家对此有解决方案。祝你好运你真的想要交叉连接吗?标题和详细记录之间没有关系?(我现在意识到,您最初的查询也在做同样的事情;我还没有通过它,在我的11.2.0.3实例上导致SIGSEGV。至少这个版本没有这样做!)我只是举了个例子。。。现在我修改了,是的,我有一个标题和细节之间的关系