2016-01-31 1 views
1

Я хочу объединить несколько XMLELEMENT для таблицы следующих столбцов и вернуть XML-файл.Как объединить несколько XMLELEMENT с помощью XMLAGG

Вот данные таблицы: enter image description here

Я хочу вернуть XML с следующим форматом:

<employee> 
<id>FMCSC00015</id> 
<year>2016</year> 
<month>1</month> 
<head_name>BASIC PAY</head_name> 
<amount>35600</amount> 
<head_name>BANK LOAN-4</head_name> 
<amount>23490</amount> 
<head_name>RESEARCH ALLOWANCE</head_name> 
<amount>1500</amount> 
<head_name>MOTOR GARAGE</head_name> 
<amount>500.5</amount> 
<head_name>CLUB</head_name> 
<amount>207</amount> 
.........so on    
<employee> 

Но я столкнулся с трудностями на агрегацию 2 колонки [head_name и сумму]. вот мой оракул код:

select xmlElement( "employee", 
         xmlelement("id", e.PAYMSTR_EMPID), 
         xmlelement("year", e.PAYMSTR_SALYR), 
         xmlelement("month", e.PAYMSTR_SALMT), 
         XMLAGG(
         XMLELEMENT(" ", 
         XMLELEMENT("head_name", e.PAYMSTR_SALHDNM), 
         XMLELEMENT("amount", e.PAYMSTR_AMOUNT) ) 
        ) 
       ) as result 
        from TBL_PAYROLL_MASTER_FILE e     
        where e.PAYMSTR_EMPID = 'FMCSC00015' 
        group by e.PAYMSTR_EMPID,e.PAYMSTR_SALYR, e.PAYMSTR_SALMT; 

Как вы можете видеть, потому что я использовал белое пространство внутри первый XMLELEMENT из XMLAgg, он по-прежнему создает пустых тегов с следующими выходными XML:

<employee> 
    <id>FMCSC00015</id> 
    <year>2016</year> 
    <month>1</month> 
    <> 
    <head_name>BASIC PAY</head_name> 
    <amount>35600</amount> 
    </> 
    <> 
    <head_name>BANK LOAN-4</head_name> 
    <amount>23490</amount> 
    </> 
    <> 
    <head_name>RESEARCH ALLOWANCE</head_name> 
    <amount>1500</amount> 
    </> 
    <>  
    <head_name>MOTOR GARAGE</head_name> 
    <amount>500.5</amount> 
    </> 
    <> 
    <head_name>CLUB</head_name> 
    <amount>207</amount> 
    .........so on    
    <employee> 

Как могу ли я избежать этих дополнительных пустых тегов и получить свой подходящий формат xml. Спасибо

+0

Я думаю, что вам нужно вместо тега '' '' внутри XMLAGG', я думаю, что вывод XML, который вы ожидаете в вышеприведенном сообщении, не будет считаться «действительным», поскольку теги 'head_name' и' amount' не будут дублироваться в тот же уровень .. – vmachan

ответ

1

Мне нужно сосредоточиться на XMLFOREST, это делает трюк.

Этот запрос предоставляет требуемый XML.

select xmlElement( "employee", 
       xmlelement("id", e.PAYMSTR_EMPID), 
       xmlelement("year", e.PAYMSTR_SALYR), 
       xmlelement("month", e.PAYMSTR_SALMT), 
       (select XMLAGG( 
       xmlforest(PAYMSTR_SALHDNM, PAYMSTR_AMOUNT )) 
       from my_tab s where s.PAYMSTR_EMPID = e.PAYMSTR_EMPID and 
        s.PAYMSTR_SALYR = e.PAYMSTR_SALYR and s.PAYMSTR_SALMT = e.PAYMSTR_SALMT)  
        ) 
from 
    (select distinct PAYMSTR_EMPID, PAYMSTR_SALYR, PAYMSTR_SALMT 
    from my_tab where PAYMSTR_EMPID = 'FMCSC00015') e; 

Обратите внимание, что, потому что ваши данные денормализованные, я сначала выбрать отличный работник, год и месяц, после того, что в подзапросе всех строки сотрудников (за год и месяц выбирается).

<employee> 
    <id>FMCSC00015</id> 
    <year>2016</year> 
    <month>1</month> 
    <PAYMSTR_SALHDNM>BASIC PAY</PAYMSTR_SALHDNM> 
    <PAYMSTR_AMOUNT>35600</PAYMSTR_AMOUNT> 
    <PAYMSTR_SALHDNM>BANK LOAN-4</PAYMSTR_SALHDNM> 
    <PAYMSTR_AMOUNT>23490</PAYMSTR_AMOUNT> 
    <PAYMSTR_SALHDNM>RESEARCH ALLOWANCE</PAYMSTR_SALHDNM> 
    <PAYMSTR_AMOUNT>1500</PAYMSTR_AMOUNT> 
    <PAYMSTR_SALHDNM>MOTOR GARAGE</PAYMSTR_SALHDNM> 
    <PAYMSTR_AMOUNT>500,5</PAYMSTR_AMOUNT> 
    <PAYMSTR_SALHDNM>CLUB</PAYMSTR_SALHDNM> 
    <PAYMSTR_AMOUNT>207</PAYMSTR_AMOUNT> 
</employee> 

В случае, если ваш сотрудник имеет больше записей (с разными годами и месяцами вы получаете один XML-строку для каждого из них

<employee> 
    <id>FMCSC00015</id> 
    <year>2015</year> 
    <month>1</month> 
    <PAYMSTR_SALHDNM>CLUB</PAYMSTR_SALHDNM> 
    <PAYMSTR_AMOUNT>207</PAYMSTR_AMOUNT> 
</employee> 

Моих данные испытаний

create table my_tab as 
select 'FMCSC00015' PAYMSTR_EMPID, 2016 PAYMSTR_SALYR, 1 PAYMSTR_SALMT, 'BASIC PAY' PAYMSTR_SALHDNM, 35600 PAYMSTR_AMOUNT from dual union all 
select 'FMCSC00015' id, 2016 year, 1 month, 'BANK LOAN-4' head_name, 23490 amount from dual union all 
select 'FMCSC00015' id, 2016 year, 1 month, 'RESEARCH ALLOWANCE' head_name, 1500 amount from dual union all 
select 'FMCSC00015' id, 2016 year, 1 month, 'MOTOR GARAGE' head_name, 500.5 amount from dual union all 
select 'FMCSC00015' id, 2016 year, 1 month, 'CLUB' head_name, 207 amount from dual union all 
select 'FMCSC00015' id, 2015 year, 1 month, 'CLUB' head_name, 207 amount from dual union all 
select 'FMCSC00016' id, 2016 year, 1 month, 'CLUB' head_name, 207 amount from dual; 
+0

Спасибо @Marmite Bomber.it работал. Также не могли бы вы рассказать, почему xml заменяет АССОЦИАЦИЮ СЕМЬИ УЧАСТНИКА УЧИТЕЛЯ в УЧИТЕЛЬ ' S СЕМЕЙНЫЙ БЛАГОТВОРИТЕЛЬ ASSOC и МУНИЦИПАЛЬНОЕ НАЛОГИ И БЛОК CH. в МУНИЦИПАЛЬНОЕ НАЛОГИ & SWEAPER CH.. как решить this.thanks – user5005768

+1

@ user5005768 XML должен избегать некоторых символов, вам нужно будет жить с ним. См. Http://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents –