下の表を見つけてください。データ全体が DOCSTART と DOCEND 内にあります。データは、さらに BACCSTART と BACCEND で囲まれています。このタイプのブロックは繰り返し可能です。BACCSTART と BACCEND 内の各ブロックについて、反復可能な ABCD と TOTAL (ブロックごとに 1 回発生) および ACCNAME (ブロックごとに 1 回発生) のいずれかを選択し、次のような 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
これで私を助けてください。これが時間効率の良いクエリで可能である場合。
オラクル10gです。
要件に変更が加えられました。ACCNAME の値は、約 90 行の別の cofig テーブルに存在します。そこから、ACCNAME の value1 と対応する value2 および value3 という 3 つの値を取得し、xml にタグとして入力する必要があります。そのテーブルに参加すると、パフォーマンスが影響を受けます。提案してください。構成テーブルは次のようになります
HEADER1 HEADER2 HEADER3 HEADER4 ........
<ACCNAME> value2 value3
.............
.............
.............
.............
上に示したデータは、それを long として含むテーブルから取得します。それを 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;
また、これを処理するためのより良い方法があれば提案してください。