Вопрос:
Я создал следующую таблицу:
Вот пример строки данных:
Внутри этой таблицы в столбце SALPROFILE данные каждого столбца содержат большие данные xml, такие как следующий пример:
<employee> <id>FMCSC00015</id> <year>2016</year> <month>1</month> <PAYMSTR_SALHDNM>BASIC PAY</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>35600</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>ASSOCIATION SUBSCRIPTION</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>240</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>TELEPHONE ALLOWANCE</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>800</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>HOUSE RENT DEDUCTION</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>2587.5</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>MEDICAL ALLOWANCE</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>700</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>GAS BILL</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>450</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>LIFE INSURANCE PREMIUM (D)</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>1718</PAYMSTR_AMOUNT> </employee>
Я хочу добавить и удалить теги xml из вышеприведенного образца. Например, я хочу удалить
<PAYMSTR_SALHDNM>BASIC PAY</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>35600</PAYMSTR_AMOUNT>
и я хочу добавить
<PAYMSTR_SALHDNM>BANK LOAN</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>23490</PAYMSTR_AMOUNT>
Как я могу это сделать. Это возможно сделать это, не отслеживая все данные xml, чтобы сделать его более быстрым. Я видел, что функция Appendchildxml устарела
Ответ №1
Вы можете изменить свой XML, добавив/удалив теги с помощью следующего: с помощью AppendChildXML и deleteXML.
В этом примере первая часть возвращает ваш XML с одним тегом больше, а второй столбец удаляет тег, который соответствует условию между […]:
with xmlTab(val) as ( select xmlType(‘<employee> <id>FMCSC00015</id> <year>2016</year> <month>1</month> <PAYMSTR_SALHDNM>BASIC PAY</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>35600</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>ASSOCIATION SUBSCRIPTION</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>240</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>TELEPHONE ALLOWANCE</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>800</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>HOUSE RENT DEDUCTION</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>2587.5</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>MEDICAL ALLOWANCE</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>700</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>GAS BILL</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>450</PAYMSTR_AMOUNT> <PAYMSTR_SALHDNM>LIFE INSURANCE PREMIUM (D)</PAYMSTR_SALHDNM> <PAYMSTR_AMOUNT>1718</PAYMSTR_AMOUNT> </employee>’) from dual ) select APPENDCHILDXML( val, ’employee’, XMLType(‘<PAYMSTR_SALHDNM>SONALI BANK LOAN-4</PAYMSTR_SALHDNM>’) ) as APPEND, DELETEXML(val,’/employee/PAYMSTR_AMOUNT[.=»1718″]’) AS DEL from xmlTab
XML для добавления может быть динамически построен путем чтения данных из другой таблицы, например, таким образом:
with test as ( select ‘PAYMSTR_SALHDNM’ tag, ‘SONALI BANK LOAN-4’ val from dual union all select ‘PAYMSTR_SALHDNM’ tag, ‘GAS BILL’ val from dual ) select XMLELEMENT(tag, val) from test