Sql 在oracle中构建xml而不需要不必要的标记
我想用sql在oracle中构建XML,经过一点研究,我发现了一种用sql函数构建XML的方法,我完全不知道有任何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
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。至少这个版本没有这样做!)我只是举了个例子。。。现在我修改了,是的,我有一个标题和细节之间的关系