请找到下表。整个数据在 DOCSTART 和 DOCEND 内。数据进一步包含在 BACCSTART 和 BACCEND 中。这种类型的块是可重复的。我必须为 BACCSTART 和 BACCEND 中的每个块选择任何可重复的 ABCD 和 TOTAL(每个块发生一次)和 ACCNAME(每个块发生一次),并形成一个类似的 xml
<BACCSTART>
<TOTAL>100</TOTAL>
<ABCD>abcd</ABCD>
<ACCNAME>name</ACCNAME>
</BACCSTART>
对于每个这样的块。目前我正在使用 for 循环,但性能达不到标准。它将有大约 200 个这样的块,我必须在 15 秒内形成 xml。目前 for 循环大约需要 53 秒。
ROWNUM NAME VALUE
1 DOCSTART null
2 BACCSTART null
3 ABCD abcd
4 ABCD abcd2
5 PQRS pqrs
6 PQRS pqrs2
7 TOTAL 100
8 ACCNAME name
9 BACCEND null
10 BACCSTART null
11 ABCD abcd
12 ABCD abcd2
13 PQRS pqrs3
14 PQRS pqrs4
15 TOTAL 150
16 ACCNAME name
17 BACCEND null
18 DOCEND null
这个你能帮我吗。如果通过时间有效的查询可以做到这一点。
它是oracle 10g。
我刚刚对需求进行了修改。ACCNAME 的值存在于另一个大约 90 行的配置表中。从那里我必须拿起三个值,比如 ACCNAME 的 value1 和相应的 value2 和 value3 并作为标签填充到 xml 中。如果我加入该表的性能会影响。请建议。配置表就像
HEADER1 HEADER2 HEADER3 HEADER4 ........
<ACCNAME> value2 value3
.............
.............
.............
.............
我上面提供的数据,我从一个包含它的表中得到它。将其转换为 clob 并使用 xmltable 后,我得到了上述数据。在继续之前使用全局临时表插入数据会更好吗?像
insert into data(row_num,name,value)
select /*+ no_xml_query_rewrite , parallel(x,8) */ rownum rn, substr(extractvalue(x.column_value,'/e'),1,instr(extractvalue(x.column_value,'/e'),' ')-1) name,
substr(extractvalue(x.column_value,'/e'),instr(extractvalue(x.column_value,'/e'),' ')+1) value
from dual,
xmltable('e' passing xmltype('<e><e>' ||
replace(long2clob('select longdata from billedacc order by segment_number'),
'|'||chr(10), '</e><e>') || '</e></e>').extract('e/e')
) x;
还建议是否有更好的方法来处理这个问题。