Преобразование XML в строки и столбцы в Oracle:
C12 и c13 имеют несколько значений, поэтому этот запрос не выполняется
c12 и c13 имеет несколько значений под m1, m2, m3 и т. д. до m42
Я хочу получить все эти значения в строках и столбцах Oracle.
12:53:06 SYS@r17dev11> select xt.* from T24.FBNK_AA_ACCOUNT_DETAILS x ,
13:08:58 2 XMLTABLE('/row' PASSING x.XMLRECORD
13:08:58 3 COLUMNS
13:08:58 4 "CONTRACT.DATE" DATE PATH 'c1',
13:08:58 5 "VALUE.DATE" DATE PATH 'c2',
13:08:58 6 "PAYMENT.START.DATE" DATE PATH 'c5',
13:08:58 7 "MATURITY.DATE" DATE PATH 'c6',
13:08:58 8 "BILL.PAY.DATE"DATE PATH 'c12',
13:08:58 9 "BILL.ID" VARCHAR2(20) PATH 'c13'
13:08:58 10 ) xt where rownum<5;
XMLTABLE('/row' PASSING x.XMLRECORD
*
ERROR at line 2:
ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton sequence - got multi-item sequence
Elapsed: 00:00:00.03
ниже код XML
C12 и C13 содержит несколько значений, и мне нужны все эти значения в таблице
1* select x.XMLRECORD.getClobVal() from T24.FBNK_AA_ACCOUNT_DETAILS x where rownum<2
16:17:31 SYS@r17dev11> /
X.XMLRECORD.GETCLOBVAL()
--------------------------------------------------------------------------------
<row id='AA132364NK43'><c1>20130824</c1><c2>20130824</c2><c3>20130828</c3><c5>20
130927</c5><c6>20380831</c6><c7>CUR</c7><c8>20180827</c8><c11>20130828</c11><c12
>20130927</c12><c12 m='2'>20131027</c12><c12 m='3'>20131127</c12><c12 m='4'>2013
1227</c12><c12 m='5'>20140127</c12><c12 m='6'>20140227</c12><c12 m='7'>20140327<
/c12><c12 m='8'>20140427</c12><c12 m='9'>20140527</c12><c12 m='10'>20140627</c12
><c12 m='11'>20140727</c12><c12 m='12'>20140827</c12><c12 m='13'>20140927</c12><
c12 m='14'>20141027</c12><c12 m='15'>20141127</c12><c12 m='16'>20141227</c12><c1
2 m='17'>20150127</c12><c12 m='18'>20150227</c12><c12 m='19'>20150327</c12><c12
m='20'>20150427</c12><c12 m='21'>20150527</c12><c12 m='22'>20150627</c12><c12 m=
'23'>20150727</c12><c12 m='24'>20150827</c12><c12 m='25'>20150927</c12><c12 m='2
6'>20151027</c12><c12 m='27'>20151127</c12><c12 m='28'>20151227</c12><c12 m='29'
>20160127</c12><c12 m='30'>20160227</c12><c12 m='31'>20160327</c12><c12 m='32'>2
0160427</c12><c12 m='33'>20160527</c12><c12 m='34'>20160627</c12><c12 m='35'>201
60727</c12><c12 m='36'>20160827</c12><c12 m='37'>20160927</c12><c12 m='38'>20161
027</c12><c12 m='39'>20161127</c12><c12 m='40'>20161227</c12><c12 m='41'>2017012
7</c12><c12 m='42'>20170227</c12><c13>AABILL13265WLWSR</c13><c13 m='2'>AABILL132
95PD9RK</c13><c13 m='3'>AABILL133263FXPS</c13><c13 m='4'>AABILL133568M6DK</c13><
c13 m='5'>AABILL14022VH2JB</c13><c13 m='6'>AABILL14053G95RF</c13><c13 m='7'>AABI
LL140814YYC3</c13><c13 m='8'>AABILL14112M0MZ4</c13><c13 m='9'>AABILL14142RRH3P</
c13><c13 m='10'>AABILL14173D6GZJ</c13><c13 m='11'>AABILL14203HY9V6</c13><c13 m='
12'>AABILL142341G2BW</c13><c13 m='13'>AABILL142651P9D9</c13><c13 m='14'>AABILL14
295FC8G1</c13><c13 m='15'>AABILL14326LY4DN</c13><c13 m='16'>AABILL14356GTNDX</c1
3><c13 m='17'>AABILL15022FPV3V</c13><c13 m='18'>AABILL1505397QRV</c13><c13 m='19
'>AABILL15081R8PYH</c13><c13 m='20'>AABILL15112NPQ80</c13><c13 m='21'>AABILL1514
2RS60L</c13><c13 m='22'>AABILL1517394B3C</c13><c13 m='23'>AABILL1520399HHS</c13>
<c13 m='24'>AABILL15234G8QQ6</c13><c13 m='25'>AABILL15265G9TT8</c13><c13 m='26'>
AABILL1529522SSF</c13><c13 m='27'>AABILL15326DJW22</c13><c13 m='28'>AABILL15356B
XFX4</c13><c13 m='29'>AABILL16022LVK4B</c13><c13 m='30'>AABILL160535VKDY</c13><c
13 m='31'>AABILL16082999WH</c13><c13 m='32'>AABILL16113HDW4T</c13><c13 m='33'>AA
BILL16143QBV97</c13><c13 m='34'>AABILL16174QWS79</c13><c13 m='35'>AABILL16204Y60
RR</c13><c13 m='36'>AABILL16235V98PJ</c13><c13 m='37'>AABILL16266XSY2W</c13><c13
m='38'>AABILL16296GGLQG</c13><c13 m='39'>AABILL16327720SX</c13><c13 m='40'>AABI
LL16357PBM9X</c13><c13 m='41'>AABILL17022R86MS</c13><c13 m='42'>AABILL1705305GMP
</c13><c14>AAACT13265080Q418K</c14><c14 m='2'>AAACT132952XTB10G3</c14><c14 m='3'
я могу получить такие значения по одному
1 select xt.* from T24.FBNK_AA_ACCOUNT_DETAILS x ,
2 XMLTABLE('/row' PASSING x.XMLRECORD
3 COLUMNS
4 "CONTRACT.DATE" DATE PATH 'c1',
5 "VALUE.DATE" DATE PATH 'c2',
6 "PAYMENT.START.DATE" DATE PATH 'c5',
7 "MATURITY.DATE" DATE PATH 'c6',
8 "BILL.PAY.DATE" DATE PATH 'c12[@m=8]',
9 "BILL.ID" VARCHAR2(512) PATH 'c13[@m=8]'
10* ) xt where rownum<5
16:13:51 SYS@r17dev11> /
CONTRACT. VALUE.DAT PAYMENT.S MATURITY. BILL.PAY.DATE BILL.ID
--------- --------- --------- --------- ------------------------------ ----------------------------------------
24-AUG-13 24-AUG-13 27-SEP-13 31-AUG-38 27-APR-14 AABILL14112M0MZ4
08-FEB-13 08-FEB-13 13-FEB-13 08-FEB-14
08-FEB-13 08-FEB-13 01-MAR-13 01-AUG-46 01-OCT-13 AABILL132695KKSX
19-FEB-13 19-FEB-13 01-MAR-13 19-FEB-14 01-OCT-13 AABILL13269YF6XQ
, а затем для других значений я могу изменить атрибут "m" и получить другие значения. но это решение не очень практично
1 select xt.* from T24.FBNK_AA_ACCOUNT_DETAILS x ,
2 XMLTABLE('/row' PASSING x.XMLRECORD
3 COLUMNS
4 "CONTRACT.DATE" DATE PATH 'c1',
5 "VALUE.DATE" DATE PATH 'c2',
6 "PAYMENT.START.DATE" DATE PATH 'c5',
7 "MATURITY.DATE" DATE PATH 'c6',
8 "BILL.PAY.DATE" DATE PATH 'c12[@m=7]',
9 "BILL.ID" VARCHAR2(512) PATH 'c13[@m=7]'
10* ) xt where rownum<5
16:13:23 SYS@r17dev11> /
CONTRACT. VALUE.DAT PAYMENT.S MATURITY. BILL.PAY.DATE BILL.ID
--------- --------- --------- --------- ------------------------------ ----------------------------------------
24-AUG-13 24-AUG-13 27-SEP-13 31-AUG-38 27-MAR-14 AABILL140814YYC3
08-FEB-13 08-FEB-13 13-FEB-13 08-FEB-14
08-FEB-13 08-FEB-13 01-MAR-13 01-AUG-46 01-SEP-13 AABILL13239DK15P
19-FEB-13 19-FEB-13 01-MAR-13 19-FEB-14 01-SEP-13 AABILL132391SQT3
Я проверял еще несколько документов, в которых мы можем получить все значения в формате xml в одной строке. я попробовал этот код ниже, но не смог закончить, так как он дает все виды ошибок
документ, который я нашел -> https://www.ibm.com/developerworks/data/library/techarticle/dm-0708nicola/index.html
1 select xt.* from T24.FBNK_AA_ACCOUNT_DETAILS x ,
2 XMLTABLE('/row' PASSING x.XMLRECORD
3 COLUMNS
4 "CONTRACT.DATE" DATE PATH 'c1',
5 "VALUE.DATE" DATE PATH 'c2',
6 "PAYMENT.START.DATE" DATE PATH 'c5',
7 "MATURITY.DATE" DATE PATH 'c6',
8 "BILL.PAY.DATE" '<strong/>XML</strong>' PATH 'c12',
9 "BILL.ID" '<strong>XML</strong>' PATH 'c13'
10* ) xt where rownum<5;
16:43:50 11 /
"BILL.PAY.DATE" '<strong/>XML</strong>' PATH 'c12',
*
ERROR at line 8:
ORA-00902: invalid datatype
Я хочу, чтобы все множественные значения из c13 были только в одной строке, и он содержит более 20+ множественных значений.
Привет, Алекс,
Мое действительное требование состоит в том, чтобы получить все данные из этого xml в формате csv с каждым значением в отдельном столбце, но эти c12 и c13 усложняют задачу, поскольку они содержат атрибуты до 42, такие как m1, m2,.,. M42 и теперь, когда я использовал ваш запрос, он выдает меня в виде одного столбца, но обертывание затрудняет чтение в Excel. вывод испорчен в excel дерьмо. Можно ли получить каждое значение «м» в разных столбцах или какой-то другой метод, чтобы сделать это? , я думал, что получить его в формате XML будет хорошо. таблица содержит 300 тыс. строк.
поэтому будет лучше получить данные для c12 и c13 в формате xml или varchar с каждым значением "m" в отдельном столбце.
Единственное условие, это должно быть в читаемом формате на Excel дерьмо. нужен ваш совет по этому вопросу. таблица содержит 300 тыс. строк