1

テーブルに続く列の複数の XMLELEMENT を集約し、xml ファイルを返したいと考えています。

テーブルデータは次のとおりです。 ここに画像の説明を入力

次の形式で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 と amount] を集計する際に問題に直面しています。ここに私のオラクルコードがあります:

 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;

ご覧のとおり、XMLAGG の最初の XMLELEMENT 内で空白を使用したため、次の出力 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 形式を取得するにはどうすればよいですか。ありがとう

4

1 に答える 1

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;
于 2016-01-31T17:59:55.257 に答える