I have the following XML:
<record>
<leader>02220cim a2200325 a 4500</leader>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">P286</subfield>
</datafield>
<datafield tag="100" ind1="1" ind2=" ">
<subfield code="a">Gold, Claudia M.</subfield>
</datafield>
<datafield tag="300" ind1=" " ind2=" ">
<subfield code="a">1 disque son. (6h47) :</subfield>
<subfield code="b">numérique ;</subfield>
<subfield code="c">12 cm.</subfield>
</datafield>
<datafield tag="650" ind1=" " ind2="6">
<subfield code="a">Émotions chez l'enfant</subfield>
</datafield>
<datafield tag="650" ind1=" " ind2="6">
<subfield code="a">Parents et enfants</subfield>
</datafield>
<datafield tag="655" ind1=" " ind2="4">
<subfield code="a">Enregistrement numérique sur CD.</subfield>
</datafield>
<datafield tag="700" ind1="1" ind2=" ">
<subfield code="a">Taussig, Sylvie</subfield>
</datafield>
<datafield tag="700" ind1="1" ind2=" ">
<subfield code="a">Marcelli, Daniel</subfield>
</datafield>
<datafield tag="852" ind1=" " ind2=" ">
<subfield code="a">GBQ</subfield>
<subfield code="b">QO</subfield>
<subfield code="c">DC13378</subfield>
<subfield code="d">32002518936826</subfield>
</datafield>
<datafield tag="852" ind1=" " ind2=" ">
<subfield code="a">GBQ</subfield>
<subfield code="b">QO</subfield>
<subfield code="c">DC13378</subfield>
<subfield code="d">32002518936859</subfield>
</datafield>
</record>
I need to convert the values in rows into columns. For example:
leader datafield_035 datafield_100 datafield_300 datafield_650 ...
-----------------------------------------------------------------------
02220...
Here is what I did:
1/ Step1:
insert into table_data(leader, tag, subfield)
(
select x.leader,x1.tag, x2.subfield
from table_xml t
cross join XMLTABLE (xmlnamespaces (default 'http://www.loc.gov/MARC21/slim')
, '/collection/record'
passing t.xml_document
columns leader VARCHAR2(100) PATH 'leader',
datafield xmltype path './datafield'
) x
cross join XMLTABLE (xmlnamespaces (default 'http://www.loc.gov/MARC21/slim')
, '/datafield[@tag=245 or @tag=100 or @tag=300 or @tag=260 or @tag=650
or @tag=520 or @tag=091 or @tag=534 or @tag=245 or @tag=500 or @tag=655 or @tag=505]'
passing x.datafield
columns tag VARCHAR2(20) PATH '@tag',
subfield xmltype PATH './subfield'
)x1
cross join XMLTABLE (xmlnamespaces (default 'http://www.loc.gov/MARC21/slim')
, '/subfield'
passing x1.subfield
COLUMNS subfield varchar2(2000) PATH '.'
)x2
where t.id=3
)
;
2/Step 2:
INSERT INTO table_CLOB (leader, tag, subfield)
select leader, tag,
rtrim(xmlagg(XMLELEMENT(e,subfield, ' ; ').extract('//text()')order by subfield).getClobVal(),' ; ') as subfields
from table_data
group by leader, tag
;
3/ Step3:
insert into table_result(leader, tag, subfield)
( select leader, "'091'" as cote, "'100'" as auteur, "'245'" as titre,
"'300'" as Desc_Mater, "'260'" as edition,"'520'" as resume, "'534'" as version,
"'500'" as notes, "'650'" as sujet
from
(
select leader, tag, dbms_lob.substr(subfield,2000,1) as col
from table_clob
)
pivot(max(col) for tag in ('091', '100', '245', '260','650','520','300','534','500'))
);
After these steps, I get the result that I expect but the performance is not really good.
Is there anyway I can do one shot and get the final result?